보조 생성자

보조 생성자는 클래스의 본문에 constructor 키워드로 선언하는 함수이다. 클래스 본문에 선언하므로 여러 개를 추가할 수 있다.

다음 코드에서는 매개변수를 다르게 구성한 보조 생성자를 2개 선언했다. 보조 생성자도 생성자이므로 객체를 생성할 때 자동으로 호출된다. 그리고 보조 생성자는 클래스 본문에 선언하므로 생성자 본문을 중괄호 { }로 묶어서 객체 생성과 동시에 실행할 영역을 지정할 수 있다.

  • 보조 생성자 선언
class User{
	constructor(name : String){
		println("constructor(name : String) call...")
	}
	constructor(name: String, count : Int){
		println("constructor(name : Stirng, count: Int) call...")
	}
}

fun main(){
	val user1 = User("lh99j")
	val user2 = User("lh99j", 23)
}

보조 생성자에 주 생성자 연결

코틀린의 생성자는 주 생성자와 보조 생성자로 나뉜다. 클래스를 선언할 때 둘 중 하나만 선언하면 문제가 없지만, 만약 주 생성자와 보조 생성자를 모두 선언한다면 반드시 생성자끼리 연결해 주어야 한다.

  • 주 생성자와 보조 생성자 선언 시 오류
class User(name : String){
	constructor(name : String, count : Int){   // 오류!
		...
	}
}

클래스에 주 생성자와 보조 생성자를 모두 선언했다. 그런데 위의 코드는 오류가 발생한다. 주 생성자가 없다면 보조 생성자를 선언하는 데 문제가 없지만 주 생성자가 있으므로 보조 생성자에서 주 생성자를 호출해 주어야 한다.

보조 생성자는 객체를 생성할 때 호출되며, 이때 클래스 내에 주 생성자가 있다면 this() 구문을 이용해 주 생성자를 호출해야 한다.

  • 보조 생성자에서 주 생성자 호출
class User(name : String){
	constructor(name : String, count : Int) : this(name){    // 성공!!
		...
	}
}

fun main(){
	val user = User("lh99j", 23)
}

보조 생성자 선언분에 this(name)만 추가한 코드이다. 이렇게 하면 보조 생성자로 객체를 생성할 때 주 생성자가 같이 호출된다.

만약 주 생성자가 있는 상태에서 보조 생성자를 여러 개 선언한다면 보조 생성자에서 this()로 다른 보조 생성자를 호출할 수도 있다. 그런데 이대에도 보조 생성자로 객체를 생성한다면 어떤 식으로든 주 생성자가 호출되게 해야 한다.

  • 보조 생성자가 여럿일 때 생성자 연결
class User(name : String){
	constructor(name : String, count : Int) : this(name){
		...
	}

	constructor(name : String, count : Int, email : String) : this(name, count){
		...
	}
}

fun main(){
	val user = User("lh99j", 23, "grand2181@gmail.com")
}