IT 개발노트

생성자란? 본문

기초튼튼/JAVA

생성자란?

limsungju 2019. 1. 21. 17:54

1. 생성자
1.1 생성자란?

: 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.
생성자 역시 메서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴값이 없다는 점이 다르다.
* 생성자 앞에 리턴값이 없음을 뜻하는 void를 사용하지는 않고, 아무것도 적지 않는다.
* 생성자도 오버로딩이 가능하므로 하나의 클래스에 여러개의 생성자가 존재할 수 있다.
* 모든 클래스에는 하나이상의 생성자가 있어야한다.

1.2 생성자의 조건
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
* 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.

예시 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package sungju.Java.ConstructorTest;
 
public class ConstructorTest {
    public static void main(String[] args) {
        Data1 d1 = new Data1();
        Data2 d2 = new Data2();        // compile error발생
        
    }
    
    class Data1 {
        int value;
    }
    
    class Data2 {
        int value;
        
        Data2(int x) { // 매개변수가 있는 생성자
            value = x;
        }
    }
 
}


설명

 예시 1을 컴파일 하면 Data2에서 Data2()라는 생성자를 찾을 수 없다는 내용의 에러메시지인데, Data2에 생성자 Data2()가 정의되어 있지 않기 때문에 에러가 발생한 것이다.
Data1의 인스턴스를 생성하는 코드에는 에러가 없는데, Data2의 인스턴스를 생성하는 코드에 에러가 발생한 이유는 Data1에는 정의되어 있는 생성자가 하나도 없으므로 컴파일러가 기본 생성자를 자동으로 하나 추가해주었지만, Data2에는 이미 생성자 Data2(int x)가 정의되어 있으므로 기본 생성자가 추가되지 않았기 때문이다.
컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 '클래스 내에 생성자가 하나도 없을 때'뿐이라는 것을 명심해야한다.


1.3 생성자에서 다른 생성자 호출하기
: 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다.

1.4 생성자에서 다른 생성자 호출하는 조건
- 생성자의 이름으로 클래스대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

예시 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package sungju.Java.ConstructorTest;
 
public class ConstructorTest {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car("blue");
        
        System.out.println("c1의 color = " + c1.color + ", gearTpye = " + c1.gearType + ", door = " + c1.door);
        System.out.println("c2의 color = " + c2.color + ", gearTpye = " + c2.gearType + ", door = " + c2.door);
    }
    
    static class Car {
        String color;    // 색상
        String gearType;    // 변속기 종류
        int door;        // 문의 개수
        
        Car() {
            this("white""auto"4);    //Car(String color, String gearType, int door)를 호출
        }
        
        Car(String color) {
            this(color, "auto"4);
        }
        
        Car(String color, String gearType, int door) {
            this.color = color;
            this.gearType = gearType;
            this.door = door;
        }
    }
 
}


* 생성자의 매개변수로 선언된 변수의 이름이 color로 인스턴스변수 color와 같을 경우에는 이름만으로는 두 변수가 서로 구별이 안된다.
이런 경우에는 인스턴스변수 앞에 'this'를 사용하면 된다.
-> this.color는 인스턴스변수이고, color는 생성자의 매개변수로 정의된 지역변수로 서로 구별이 가능하다. 
* this :인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다
         모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
* this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용

'기초튼튼 > JAVA' 카테고리의 다른 글

static의 이해  (0) 2019.01.23
변수의 초기화  (0) 2019.01.22
오버로딩이란?  (0) 2019.01.19
변수의 종류와 특징  (0) 2019.01.18
객체지향의 등장 배경과 이해  (0) 2019.01.18