코틀린에는 자바와 달리 주 생성자와 부 생성자가 따로 존재한다.
각각의 차이와 언제 필요한지 알아보자.
클래스 선언 시 클래스 이름 뒤에 괄호로 둘러싸인 형태로 선언
class Person constructor(private val firstName: String) { /*...*/ }
가시성 변경자나 어노테이션이 없는 경우 constrouctor
키워드 생략 가능
class Person(val firstName: String) { /*...*/ }
클래스의 초기화를 담당 (클래스의 프로퍼티도 초기화)
코드를 포함할 수 없음
객체 초기화시 필요한 코드는 init{}
에서 처리
class Number(num: Int) {
var isBiggerThanTen = false
init {
isBiggerThanTen = num > 10
}
}
클래스 인스턴스 생성시 호출됨
주 생성자를 생략할 경우, public
의 빈 주 생성자가 자동으로 생성됨
클래스 내부에 선언 (여러개 선언 가능)
constructor
키워드 생략 불가 / 클래스의 프로퍼티 초기화 불가
클래스가 주 생성자를 가지고 있는 경우, 반드시 주 생성자로 직접 또는 다른 부 생성자를 통해 간접적으로 위임해야 함
this
키워드로 다른 생성자에게 위임
주 생성자와, 초기화 블록(init{}
) 실행 이후에 실행됨
class Person(val name: String) {
val children: MutableList<Person> = mutableListOf()
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
<aside> 💡 **부 생성자가 필요한 주된 이유는 자바 상호운용성
</aside>
<aside> 💡 언제 부 생성자를 사용할까?
부 생성자는 주 생성자를 호출하거나, 별도의 초기화 로직을 가질 수 있기 때문에, 주 생성자의 파라미터를 확장하거나, 다른 초기화 로직을 제공하는 데 사용한다!!
</aside>
아래의 항목을 예제를 통해 조금 더 자세히 알아보자