클래스 안에 init 블록이 여럿 들어갈 수 있다. 이런 경우 각 블록은 프로퍼티 초기화와 함께 순서대로 실행된다.
초기화 블록에는 return 문이 들어가지 못한다는 점에 유의하라.
class Person(firstName: String, familyName: String) {
val fullName = "$firstName $familyName"
init {
// error: 'return' is not allowed here
if (firstName.isEmpty() && familyName.isEmpty()) return
println("Created new Person instance: $fullName")
}
}
지금까지는 항상 프로퍼티 값을 프로퍼티 정의 시 초기화했다. 하지만 하나의 식으로 표현하기 어려운 복잡한 초기화 로직을 실행해야 프로퍼티를 초기화할 수 있는 경우도 있다. 이런 이유로 코틀린은 init 블록 안에서 프로퍼티를 초기화하는 것도 허용한다.
class Person(fullName: String) {
val firstName: String
val familyName: String
init {
val names = fullName.split(" ")
if (names.size != 2) {
throw IllegalArgumentException("Invalid name: $fullName")
}
firstName = names[0]
familyName = names[1]
}
}
fun main() {
val person = Person("John Doe")
println(person.firstName) // John
}