[JAVA] 생성자(Constructor)

2022. 9. 6. 14:54

생성자(Constructor)

생성자는 인스턴스를 생성하는 역할을 한다.  즉, 생성자는 인스턴스의 초기화 메서드라고 볼 수 있다.

 

생성자는 메서드와 유사하게 생겼지만 return이 없다. 이때 메서드는 return 이 없다고 void를 명시하지만 생성자는 void도 적어주지 않는다.

 

생성자의  조건

  • 생성자의 이름과 클래스의 이름이 같아야 한다.
  • 생성자는 리턴 값이 없다.
className(parameter) {
        내용
}

 

기본 생성자(Default Constructor)

앞에서 생성자는 인스턴스의 초기화 메서드라고 했다. 그런데 클래스 안에 생성자를 만들지 않아도 프로그램은 제대로 수행이 된다. 그 이유는 컴파일러가 클래스에 생성자가 없으면 기본 생성자를 만들어 주기 때문이다. 다음과 같이 만들고 프로그램을 실행시켜보자.

class Constructor { }

public class ConstructorTest {
    public static void main(String[] args) {
        Constructor c = new Constructor();
    }
}

생성자를 만들지 않고 프로그램을 돌리면 컴파일러는 자동으로 기본 생성자를 만들어 준다.

 

아래는 컴파일된 Constructor.class 파일이다.

class Constructor {
    Constructor() { /* compiled code */ }
}

이처럼 생성자를 만들어 주지 않아도 사실은 자동으로 추가된다.

 

주의할 점은 컴파일러가 기본 생성자를 만들어주는 경우는 클래스 내에 생성자가 하나도 없을 때뿐이다.

 

매개변수로 인스턴스 초기화하기

class Constructor {
    int x;
    int y;

    void show(){
        System.out.println("x = " + x + " y = " + y);
    }
}

public class ConstructorTest {
    public static void main(String[] args) {
        Constructor c = new Constructor();
        c.x = 2;
        c.y = 3;

        c.show(); //x = 2 y = 3
    }
}

위와 같이 인스턴스를 생성하고 인스턴스 변수의 값을 초기화하기 위해 하나하나 다 입력하면 코드가 길어지고 인스턴스가 많아지면 가독성도 떨어지고 깔끔하지 않다.

 

이럴 때 생성자를 통해 변수들을 깔끔하게 초기화할 수 있다.

class Constructor {
    int x;
    int y;
    //생성자로 초기화
    Constructor(int x,int y){
        this.x = x;
        this.y = y;
    }
    void show(){
        System.out.println("x = " + x + " y = " + y);
    }
}

public class ConstructorTest {
    public static void main(String[] args) {
        Constructor c = new Constructor(2, 3);

        c.show(); //x = 2 y = 3
    }
}

위처럼 매개변수와 생성자로 깔끔하게 코드 한 줄로 변수를 초기화할 수 있다.

 

앞에서 컴파일러가 기본 생성자를 만들어 주는 경우는 클래스 내에 생성자가 하나도 없을 때뿐이라고 했다. 만약 위 코드에서 new Constructor()를 작성하면 어떻게 될까?

 

class Constructor {
    int x;
    int y;
    //생성자로 초기화
    Constructor(int x,int y){
        this.x = x;
        this.y = y;
    }
    void show(){
        System.out.println("x = " + x + " y = " + y);
    }
}

public class ConstructorTest {
    public static void main(String[] args) {
        Constructor c = new Constructor(2, 3);
        Constructor c2 = new Constructor(); //에러
    }
}

ide가 친절하게 에러가 있다고 알려준다.

'Constructor(int, int)' in 'Constructor' cannot be applied to '()'

클래스 내에 생성자가 x와 y를 매개변수로 받는 생성자 하나뿐이라 에러가 발생한다.

 

이럴 땐 매개변수가 없는 생성자를 하나 오버로딩해서 만들어 주면 된다.

 

class Constructor {
    int x;
    int y;
    //생성자로 초기화
    Constructor(int x,int y){
        this.x = x;
        this.y = y;
    }
    //매개 변수가 없는 생성자
    Constructor() {

    }
    void show(){
        System.out.println("x = " + x + " y = " + y);
    }
}

public class ConstructorTest {
    public static void main(String[] args) {
        Constructor c = new Constructor(2, 3);
        Constructor c2 = new Constructor(); //에러

        c.show(); //x = 2 y = 3
        c2.show(); //x = 0 y = 0
    }
}

 

BELATED ARTICLES

more