코틀린 (Kotlin) 생성자 정리

주 생성자와 초기화 블록

코틀린의 주 생성자는 클래스 이름 뒤에 괄호로 둘러쌓여 있습니다.

open class User constructor(_nicname:String) { // 주생성자

    val nickname: String

    init {
        //주생성자와 함께 초기화 블럭
        //init 초기화 블록은 여러개 가능
        nickname = _nicname
    }
}

constructor 주 생성자부 생성자를 정의합니다.
init 초기화 블럭입니다.
이 초기화 블럭은 주 생성자와 함께 사용되며 init 은 여러개 사용할 수 있습니다.
초기화할 때 로직이 필요한 경우 init 초기화 블록내 로직을 추가하여 초기화 합니다.

조금 더 간단하게 생성자 생성하기

주 생성자 앞에 애노테이션이나 가시성 변경자가 없다면 constructor 는 생략 가능합니다.
그리고 단순히 주 생성자의 파라미터로 초기화 해줄때는 init 도 생략 가능합니다.

class User (_nicname:String) { // 주생성자: constructor 생략 가능
    //주 생성자의 파라미터로 초기화, 초기화가 없으면 프로퍼티로도 생성되지 않음,
    //getNicname() 함수가 생성 됨
    //생성자에서 this.nicname = _nicname 함
    val nickname: String = _nicname
}

최대한 간략하게 생성자 생성하기

위 코드보다 더 축약이 가능합니다.
주 생성자의 파라미터로 프로퍼티를 초기화하는 경우 생성자 파라미터에 var 또는 val 을 추가하여 간략하게 생성할 수 있습니다

//val 을 사용하면 프로퍼티가 생성 됨
//getNicname() 함수 생성 됨
//생성자에서  this.nicname = nicname 함
class User (val nicname:String) { }

위 세가지 코드는 모두 동일한 결과를 갖습니다.

생성자에 디폴트 값 정의하기

생성자 파라메터에 디폴트 값을 정의할 수 있습니다.
모든 생성자 파라미터에 디폴트 값을 추가하면 컴파일러는 자동으로 파라미터가 없는 생성자를 생성해주며 디폴트 값을 사용해 클래스를 초기화 해줍니다.

//디폴트 값 추가
class User(val nicname:String, val isSubscribed : Boolean = true) { }

자식 클래스에서 상위 클래스 super 전달하기

자식 클래스에서 상위 클래스에 super 로 파라메터를 전달하고 싶은경우에는 상위 클래스 이름 뒤에 괄호로 파라메터를 넘겨줄 수 있습니다.

//상위클래스에 파라미터를 받는 생성자가 있는경우 :User(nicname) 처럼 넘길수 있음
class TwitterUser(nicname: String) : User(nicname) {

}

디폴트 생성자만 존재하는 클래스 생성하기

클래스에 생성자가 없는경우 컴파일러가 자동으로 디폴트 생성자를 생성합니다.

open class Button //디폴트 생성자가 자동으로 생성

클래스와 인터페이스 구분하는 방법

클래스는 뒤에 괄호가 붙습니다.
인터페이스는 괄호가 붙지 않으므로 괄호가 있는경우 클래스이고 없는경우 인터페이스 입니다.

그리고 주 생성자가 없는 클래스인경우 괄호가 없습니다.

//클래스는 무조건 뒤에 괄호() 가 붙음
//인터페이스는 ()가 붙지 않음
class RadioButton : Button()

//주 생성자가 없는 클래스
open class OtherView {
    constructor(context: Context?) {  }

}

//주생성자가 없는 클래스이면 괄호() 가 없다
class OtherButton : OtherView {
    constructor(context: Context?): super(context) {  }

}

클래스 private 생성자로 만들기

외부에서 사용하지 못하도록 만들고 싶은경우 생성자에 private 를 붙일 수 있습니다.

//주 생성자에 private 하여 비공개 생성자를 생성할 수 있음
class Secretive private constructor() 

부생성자

부생성자의 주된 이유는 자바 호환성때문이기도 하고 생성하는 방법이 여러가지 인경우 부 생성자가 필요한 경우도 있습니다.

//주생성자가 없는경우 괄호 없이 constructor 를 사용(View는 자바)
class MyButton : View {

    //this 로 위임 가능
    constructor(context: Context?) : this(context, null)

    //super 로 위임 가능
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
}


*개인적으로 코틀린을 공부하면서 정리한 자료입니다. 수정 사항 및 이슈가 있는 경우 메일 부탁드립니다.

댓글

  1. 주생성자가 없는 클래스를 사용하는 방법 좀 알려주세요..

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

코틀린 (Kotlin) 인터페이스 정리

RecyclerView 에서 notifyItemChanged()의 payload 이해하기