클래스에는 생성자가 따른다. 생성자는 이름처럼 클래스가 인스턴스화 될 때, 즉 객체가 생성될 때 호출된다.
클래스를 알게 되고 마주친 생성자. 생성자에서도 마주치게 될 개념들이 많다. 하나씩 살펴보자!
기본 생성자(Default constructor)
이름 있는 생성자(Named constructor)
초기화 리스트(Initializer list)
리다이렉팅 생성자(Redirecting constructor)
상수 생성자(Constant constructor)
팩토리 생성자(Factory constructor)
1) 기본 생성자
클래스를 구현할 때 생성자를 선언하지 않으면(=생략하면) 기본 생성자가 자동으로 제공된다. 기본 생성자는 클래스명과 동일하면서 인자가 없다. 또한 기본 생성자는 부모 클래스의 인수가 없는 생성자(=기본 생성자)를 호출한다.
기본 생성자의 형태는 다음과 같다.
class 클래스명 {
클래스명() {
}
}
ex)
class Person {
Person() {
}
}
상속에 대해서 다루기 전이라 간단히 설명하면 부모 클래스는 자식 클래스에게 멤버를 물려주는(=상속하는) 관계이다. 하기 예제에서 Person 클래스가 부모 클래스이고 Student 클래스가 자식 클래스이다. extends 키워드가 어떤 클래스로부터 상속받을지 지정하는 역할을 한다.
앞선 예제를 보면 Student 클래스에는 생성자가 없다. 따라서 자동으로 기본 생성자가 제공된다. 기본 생성자는 부모 클래스의 기본 생성자를 호출한다고 했다. 실행 결과를 보면 부모 클래스인 Person 클래스의 기본 생성자가 호출되어 'This is Person constructor!'가 호출된 것을 확인할 수 있다.
동작 방식을 도식화하면 다음과 같다.
위 그림처럼 Student 클래스의 기본 생성자가 호출되고 거기서 부모 클래스의 기본 생성자를 호출한 것을 확인하고 싶다면 다음과 같이 Student 클래스에 기본 생성자를 생성하면 된다.
실행 결과를 보면 부모 클래스(Person)의 기본 생성자가 호출된 후 자식 클래스(Student)의 기본 생성자가 호출된 것을 알 수 있다.
(참고) 기본 생성자는 상속되지 않는다.
자식 클래스는 부모 클래스의 생성자를 상속받지 않는다. 앞서 말한 것처럼 자식 클래스에서 아무 생성자도 선언하지 않으면 기본 생성자만 갖는다.
2) 이름 있는 생성자
이름 있는 생성자는 말 그대로 생성자에 이름을 부여한 형태이다. 한 클래스 내에 많은 생성자를 생성하거나 생성자를 명확히 하기 위해서 사용할 수 있다.
class 클래스명 {
클래스명.생성자명() {
}
}
ex)
class Person {
Person.init() {
}
}
사용 방법은 객체 생성 시 이름 있는 생성자로 생성하면 된다.
다음 예제를 보면 Person.init() 이라는 생성자를 선언하였고 init 객체가 Person.init() 생성자를 통해 생성되었다.
(참고) 이름 없는 생성자는 단 하나만 가질 수 있다. 또한 이름 있는 생성자를 선언하면 기본 생성자는 생략할 수 없다.
1) 이름 없는 생성자를 2개 선언했을 경우 : 중복 선언 에러 발생
다음과 같이 하나를 이름 있는 생성자로 변경해야 된다.
2) 이름 있는 생성자 선언했을 경우 기본 생성자 생략 불가능
이름 있는 생성자를 선언하면 인자가 없는 기본 생성자 생략이 되지 않는다고 했는데 다음 예제를 보면 기본 생성자가 없다?? 생략됐잖아!!
그럼 기본 생성자로 객체를 만들어볼까? 어림도 없지! 생략 가능하다는 진정한 의미는 선언하지 않아도 자동으로 있는 것처럼 동작을 해야 한다.
기본 생성자를 명시적으로 선언하면 잘된다.
3) 초기화 리스트
초기화 리스트를 사용하면 생성자의 구현부가 실행되기 전에 인스턴스 변수를 초기화할 수 있다. 초기화 리스트는 생성자 옆에 :(콜론)으로 선언할 수 있다.
생성자 : 초기화 리스트 {
}
ex)
Person() : name = 'Kim' {
}
다음 예제를 보면 Person 클래스에서 name은 초기화된 적이 없다. 하지만 person 객체를 만들면서 생성자 호출 시 초기화 리스트에서 Kim으로 초기화했다. 따라서 생성자의 구현부에 진입 전 name이 초기화되어서 출력할 때 Kim이 출력되는 것이다.
읽기에 부담스럽지 않은 분량을 위해체력이 모자라서 남은 3가지 리다이렉팅, 상수, 팩토리 생성자는 다음에 이어서 살펴보겠다.