본문 바로가기
JAVA/기본

#5 생성자(Constructor)

by 히포파타마스 2021. 4. 28.

생성자

 

1. 생성자란?

생성자는 인스턴트가 생성될 때 호출되는 인스턴트 초기화 매서드이다.

 

즉, 생성자를 통해서 인스턴스를 생성함과 동시에 인스턴트 변수들을 초기화 할 수 있다는 것이다.

 

 

2. 생성자의 조건과 정의

생성자는 다음과 같은 조건을 만족해야 한다.

 

■ 생성자의 이름은 클래스의 이름과 같아야 한다.

■ 생성자는 리턴 값이 없다.

 

생성자는 다음과 같은 형식으로 만들어진다.

 

 

[생성자 예시 그 #1]

클래스이름(타입 변수명, ...) {
    // 인스턴트 생성 시 수행될 코드,
}

인스턴스를 생성할 때 초기화 할 인스턴스 변수의 타입으로 매개변수를 받는다.

 

블럭에는 인스턴트를 생성 할 때 수행될 코드가 들어가는데 주로 인스턴스 변수를 초기화 하는 코드가 들어간다.

 

 

[생성자 예시 그 #2]

public class Main {
    public static void main(String args[]) {
        Card test = new Card("green", 3);
        System.out.println(test.color);
        System.out.println(test.num);
    }

    static class Card {
        String color;
        int num;

        public Card(String c, int n) {          // 생성자
            color = c;
            num = n;
        }
    }
}

위의 예제에서 Card라는 클래스는 color와 num이라는 인스턴스 변수를 초기화하는 생성자를 갖고있다.

 

main 매서드에서 Card의 인스턴스를 생성할 때 생성자를 통해 각 변수를 초기화할 값을 입력하였다.

 

생성된 인스턴스의 변수를 출력하면 아래와 같은 결과를 확인 할 수 있다.

 

 

[결과]

green
3

생성자로 초기화 한 값이 출력된 것을 확인 할 수 있다.

 

※ 생성자 역시 오버로딩이 가능하므로 하나의 클래스에 복수의 생성자가 존재 할 수 있다.

 

 

■ 생성자는 적어도 하나 이상이 클래스에 존재 해야 한다.

 

클래스 내에 생성자가 없을 경우 매개변수가 없는 기본 생성자가 컴파일러에 의해 추가된다.

 

단, 생성자가 하나라도 정의 되어 있을 경우 기본 생성자는 자동으로 추가되지 않는다.

 

 

3. 생성자 호출과 this

생성자 간에도 서로 호출이 가능하다. 단 다음의 두 조건을 만족시켜야 한다.

 

■ 생성자의 이름으로 클래스이름 대신 this를 사용한다.

■ 다른 생성자를 호출 할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

생성자를 호출 할 때 첫 줄에서만 호출 하는 이유는 다음과 같다.

 

만약 생성자를 호출하는 생성자가 인스턴트 멤버를 먼저 초기화한 뒤, 생성자를 호출 할 경우 인스턴트 멤버가 또 다시 초기화 되서 기존의 초기화 작업이 무의미해 질 수 있기 때문이다.

 

[생성자 호출 예시]

public class Main {
    public static void main(String args[]) {
        Card a = new Card("Red");
        System.out.println(a.color);
        System.out.println(a.num);
    }

    static class Card {
        String color;
        int num;

        public Card(String color) {     // 생성자_1
            this(color, 3);
        }

        public Card(String c, int n) {  // 생성자_2
            color = c;
            num = n;
        }
    }
}

클래스 Card의 첫 번째 생성자는 두 번째 생성자를 호출한다.

 

첫 번째 생성자는 매개변수로 color 하나를 받지만 두번째 생성자를 호출해서 매개변수로 받은 color값과 '3'을 넣어준다.

 

즉, 첫 번째 생성자로 Card의 인스턴스를 생성할 때 color값만 부여해도 자동적으로 num의 값은 3으로 초기화 된다.

 

위의 예제에서는 main 매서드에서 Card의 인스턴스를 생성할 때 "Red"라는 color값만 주었다.

 

생성한 인스턴스의 각 변수를 출력한 결과는 아래와 같다.

 

 

[결과]

Red
3

인스턴스를 생성할 때 num에 대한 값은 넣지 않았지만 자동적으로 '3'으로 초기화 된 것을 확인 할 수 있다.

 

 

■ 참조변수 this

 

클래스 내에서 인스턴스 자신을 참조하고 싶은 경우 this를 사용하면 된다.

 

[참조변수 this사용 예시]

static class Card {
    String color;
    int num;

    public Card(String color, int num) {
        this.color = color;
        this.num = num;
    }
}

위와 같이 생성자의 매개변수로 인스턴스 변수의 이름을 사용해야 될 때, 매개변수와 인스턴스 변수가 중복되게 된다.

 

이 경우 두 변수를 구분하기 위해서 인스턴스 자기 자신을 참조하여 인스턴스 변수를 사용해야 된다.

 

이 때 '클래스.인스턴스_변수'와 같은 형식 대신 'this.인스턴스_변수'의 형식을 사용해야 한다.

 

이 경우 this는 참조변수로 인스턴스 자신을 가리킨다. 

 

※ 생성자를 호출할 때의 this()(생성자)와 인스턴스 자신을 참조하는 this(참조변수)는 다르다.

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

람다(Lambda)  (0) 2021.11.28
예외 처리(exception handling)  (0) 2021.08.02
#4 오버로딩(overloading)  (0) 2021.04.28
#3 변수, 메서드  (0) 2021.04.23
#2 클래스, 인스턴스  (0) 2021.04.21

댓글