생성자
1. 생성자
생성자는 메서드처럼 클래스내에서 호출되는 인스턴스 초기화 메서드입니다. 다음과 같은 특징이 있습니다.
- 생성자명은 클래스명과 동일하다.
- 리턴값과 선언부의 리턴타입이 없다.
- 오버로딩이 가능하여 한 클래스에 여러 개의 생성자를 만들 수 있다.
다음 코드를 통해 생성자를 확인해보겠습니다.
class Card { Card() { // 매개변수가 없는 생성자 } Card(String k, int num) { // 매개변수가 있는 생성자 } }
또한 위의 Card 클래스의 인스턴스를 생성하는 코드를 통해 수행 과정을 나눠보면 다음과 같습니다.
Card card = new Card();
1. new 연산자에 의해서 Card 클래스의 인스턴스가 힙(heap) 영역에 생성된다.
2. Card() 생성자가 호출되어 수행된다.
3. 생성된 Card 인스턴스의 주소값이 참조변수 card에 저장된다.
인스턴스 생성을 위해 사용했던 클래스명()이 생성자였던 것을 알 수 있습니다.
※ 기본생성자
지금까지는 생성자없이 클래스를 작성해도 이상이 없었지만, 사실은 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 합니다.
클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 것은 컴파일러가 기본 생성자를 제공하여 가능한 것이었습니다.
단, 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없는 경우이므로 이 점에 주의하여야 합니다.
1.1 생성자간의 호출
같은 클래스내에서 멤버들 간에 서로 호출이 가능한 것처럼 생성자간에도 서로 호출이 가능합니다. 다음과 같은 특징이 있습니다.
- 호출할 생성자명으로 클래스명 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 생성자의 첫 줄에서만 호출이 가능하다.
다음 예제 코드를 통해 확인해보겠습니다.
class Car { String color; String gearType; int door; Car() { this("white", "auto", "4"); } Car(String color) { this(color, "auto", "4"); } Car(String color, String gearType, int door) { this.color = color; this.gearType = gearType; this.door = door; } }
다른 생성자를 호출하여 인스턴스 변수들을 초기화하는 것을 확인할 수 있습니다.
※ this와 this()
- this : 인스턴스 자신을 가리키는 참조변수. (인스턴스의 주소가 저장되어 있으며, 모든 인스턴스 메서드에 숨겨진 지역변수로 존재함)
- this(), this(매개변수) : 생성자로 사용되며 같은 클래스내의 다른 생성자를 호출할 때 사용한다.
이상으로 자바의 생성자에 대해서 알아봤습니다.
※ 참고 문헌
남궁성, 『Java의 정석 2nd Edition』, 도우출판(2010)