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