자바에서는 생성자를 하나 이상 선언할 수 있다. 코틀린에서도 한 개 이상의 생성자를 선언할 수 있지만, 주(primary) 생성자와 부(secondary) 생성자를 구분한다.
주 생성자 : 클래스를 초기화할 때 주로 사용하는 간략한 생성자로, 클래스 본문 밖에서 정의한다. 부 생성자 : 클래스 본문 안에서 정의한다.
또한 코틀린에서는 초기화 블록(initializer block)을 통해 초기화 로직을 추가할 수 있다.
주 생성자: 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드
ex) class User(val nickName: String)
주 생성자의 목적
class User constructor(_nickname: String) {
private val nickname: String
init {
nickname = _nickname // 생성자 파라미터를 nickname으로 선언할 경우, this.nickname으로 접근
}
}
초기화 블록에는 클래스의 객체가 만들어질 때(인스턴스화될 때) 실행될 초기화 코드가 들어간다.
초기화 블록은 주 생성자와 함께 사용된다. 주 생성자는 제한적이기 때문에 별도의 코드를 포함할 수 없으므로 초기화 블록이 필요하다.
필요하다면 클래스 안에 여러 초기화 블록을 선언할 수 있다.
주 생성자 앞에 별다른 애노테이션이나 가시성 변경자가 없다면 constructor를 생략해도 된다.
class User(_nickname: String) {
private val nickname = _nickname
}
모든 생성자 파라미터에 디폴트 값을 지정하면 컴파일러가 자동으로 파라미터가 없는 생성자를 만들어준다. 자동으로 만들어진 파라미터 없는 생성자는 디폴트 값을 사용해 클래스를 초기화한다.
클래스에 기반 클래스가 있다면 주 생성자에서 기반 클래스의 생성자를 호출해야 한다.
open class User(val nickname: String)
class TwitterUser(nickname: String) : User(nickname)
클래스를 정의할 때 별도로 생성자를 정의하지 않으면 컴파일러가 자동으로 아무 일도 하지 않는 인자가 없는 디폴트 생성자를 만들어준다.
open class User
class TwitterUser(nickname: String) : User()