더북(TheBook)

이 예제에서 init 블록은 fullName을 공백으로 분리된 부분 문자열의 배열로 나눈 다음에 이를 사용해 firstNamefamilyName 프로퍼티를 초기화한다.

컴파일러는 모든 프로퍼티가 확실히 초기화되는지 확인한다. 컴파일러가 주생성자의 모든 실행 경로가 모든 멤버 프로퍼티를 초기화하거나 (일부 프로퍼티가 초기화되지 않는 경우) 예외를 발생시키는지 확인할 수 없다면 다음과 같은 오류가 발생한다.

class Person(fullName: String) {
  // error: property must be initialized or be abstract
  val firstName: String
  val familyName: String
  init {
    val names = fullName.split(" ")
    if (names.size == 2) {
      firstName = names[0]
      familyName = names[1]
    }
  }
}

주생성자 파라미터를 프로퍼티 초기화나 init 블록 밖에서 사용할 수는 없다. 예를 들어 멤버 함수 내부에서는 firstName을 사용할 수 없기 때문에 다음 코드는 잘못된 코드다.

class Person(firstName: String, familyName: String) {
  val fullName = "$firstName $familyName"
  fun printFirstName() {
    println(firstName) // Error: first name is not available here
  }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.