함수와 마찬가지로 디폴트 값과 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]
      }
    }
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.