보조 생성자
보조 생성자는 클래스의 본문에 constructor 키워드로 선언하는 함수, 클래스 본문에 선언하므로 여러 개를 추가할 수 있습니다.
다음 코드에서는 매개변수를 다르게 구성한 보조 생성자 2개를 선언했습니다. 보조 생성자도 생성자 이므로 객체를 생성할 때 자동으로 호출됩니다. 그리고 보조 생성자는 클래스 본문에 선언하므로 생성자 본문을 중괄호 {}로 묶어서 객체 생성과 동시에 실행할 영역을 지정할 수 있습니다.
보조 생성자 선언 class User{ constructor(name: String){ println("constructor(name: String) call...") } constructor(name: String, count: Int){ println("constructor(name: String, count: Int) call...") } } fun main(){ val user1 = User("kkang") val user2 = User("kkang", 10) } >> 실행결과 constructor(name: String) call... constructor(name: String, count: Int) call...
보조 생성자에 주 생성자 연결
코틀린의 생성자는 주 생성자와 보조 생성자로 나뉩니다. 클래스를 선언할 때 둘 중 하나만 선언하면 문제가 없지만, 만약 주 생성자와 보조 생성자를 모두 선언한다면 반드시 생성자끼리 연결해 주어야 합니다.
주 생성자와 보조 생성자 선언 시 오류 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("kkang", 10) }
보조 생성자 선언부에 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("kkang", 10, "a@a.com") } 같은 모양으로 묶음
클래스를 재사용하는 상속 – 상속과 생성자
클래스를 선언할 때 다른 클래스를 참조해서 선언하는 것을 상속 이라고 합니다. 코틀린에서 어떤 클래스를 상속받으려면 선언부에 콜론: 과 함께 상속받을 클래스 이름을 입력합니다. 이렇게 하면 기존 클래스를 재 사용할수 있습니다.
클래스 상속 형식 open class Super{ // 상속할 수 있게 open 키워드 이용 } class Sub: Super(){ // Super를 상속받아 Sub 클래스 선언
상속 관계에서 상속 대상이 되는 클래스를 상위 클래스라고 하고, 상속받는 클래스를 하위 클래스라고 합니다. 코틀린의 클래스는 기본적으로 다른 클래스가 상속할 수 없습니다. 다시 말해 class Super{} 처럼 클래스를 선언하면 다른 클래스에서 Super 클래스를 상속할 수 없습니다. 만약 다른 클래스에서 상속할 수 있게 선언하려면 open 키워드를 사용해야합니다. 즉 open class Super {} 라고 선언하면 Super 클래스의 상속을 허용합니다.
하위 클래스를 선언할 때는 이름 뒤에 콜론(:)을 입력하고 상속받을 상위 클래스 이름을 입력합니다. class Sub: Super() {} 코드는 Super 클래스를 상속받아 Sub 클래스를 선언한 구문입니다.
상위 클래스를 상속받은 하위 클래스의 생성자에서는 상위 클래스의 생성자를 호출해야 합니다. class Sub: Super() {}코드에서 Super()는 Super 클래스를 상속받으면서 이 클래스의 매개변수가 없는 생성자를 호출합니다. 만약 매개변수가 있는 상위 클래스의 생성자를 호출할 때는 다음처럼 매개변수 구성에 맞게 인자를 전달해야 합니다.
매개변수가 있는 상위 클래스의 생성자 호출 open class Super(name: String){ } class Sub(name: String): Super(name){ }
상위 클래스의 생성자 호출문을 꼭 클래스 선언부에 작성할 필요는 없습니다. 만약 하위 클래스에 보조 생성자만 있다면 상위 클래스의 생성자를 다음처럼 호출할 수 있습니다.
하위 클래스에 보조 생성자만 있는 경우 상위 클래스의 생성자 호출 open class Super(name: String){ } class Sub: Super{ constructor(name: String): super(name){ } }