함수와 마찬가지로 디폴트 값과 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]
}
}