더북(TheBook)

함수와 마찬가지로 디폴트 값과 vararg를 생성자 파라미터에 사용할 수 있다.

class Person(val firstName: String, val familyName: String = "") {
  fun fullName() = "$firstName $familyName"
}

class Room(vararg val persons: Person) {
  fun showNames() {
    for (person in persons) println(person.fullName())
  }
}

fun main() {
  val room = Room(Person("John"), Person("Jane", "Smith"))
  room.showNames()
}

여러 생성자를 사용해 클래스 인스턴스를 서로 다른 방법으로 초기화하고 싶을 때도 있다. 이런 경우도 대부분은 디폴트 파라미터를 사용하는 주생성자로 해결할 수 있지만, 경우에 따라 주생성자만으로는 충분하지 않을 수도 있다. 코틀린에서는 이런 문제를 부생성자(secondary constructor)를 사용해 해결할 수 있다. 부생성자 문법은 함수 이름 대신에 constructor 키워드를 사용한다는 점을 제외하면 함수 정의 문법과 비슷하다.

class Person {
  val firstName: String
  val familyName: String
  
  constructor(firstName: String, familyName: String) {
    this.firstName = firstName
    this.familyName = familyName
  }
  
  constructor(fullName: String) {
    val names = fullName.split(" ")
    if (names.size != 2) {
      throw IllegalArgumentException("Invalid name: $fullName")
    }
    firstName = names[0]
    familyName = names[1]
  }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.