코틀린 (Kotlin) 생성자 정리
주 생성자와 초기화 블록
코틀린의 주 생성자는 클래스 이름 뒤에 괄호로 둘러쌓여 있습니다.
open class User constructor(_nicname:String) { // 주생성자
val nickname: String
init {
//주생성자와 함께 초기화 블럭
//init 초기화 블록은 여러개 가능
nickname = _nicname
}
}
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
}
//주 생성자의 파라미터로 초기화, 초기화가 없으면 프로퍼티로도 생성되지 않음,
//getNicname() 함수가 생성 됨
//생성자에서 this.nicname = _nicname 함
val nickname: String = _nicname
}
최대한 간략하게 생성자 생성하기
위 코드보다 더 축약이 가능합니다.주 생성자의 파라미터로 프로퍼티를 초기화하는 경우 생성자 파라미터에 var 또는 val 을 추가하여 간략하게 생성할 수 있습니다
//val 을 사용하면 프로퍼티가 생성 됨
//getNicname() 함수 생성 됨
//생성자에서 this.nicname = nicname 함
class User (val nicname:String) { }
//getNicname() 함수 생성 됨
//생성자에서 this.nicname = nicname 함
class User (val nicname:String) { }
위 세가지 코드는 모두 동일한 결과를 갖습니다.
생성자에 디폴트 값 정의하기
생성자 파라메터에 디폴트 값을 정의할 수 있습니다.모든 생성자 파라미터에 디폴트 값을 추가하면 컴파일러는 자동으로 파라미터가 없는 생성자를 생성해주며 디폴트 값을 사용해 클래스를 초기화 해줍니다.
//디폴트 값 추가
class User(val nicname:String, val isSubscribed : Boolean = true) { }
class User(val nicname:String, val isSubscribed : Boolean = true) { }
자식 클래스에서 상위 클래스 super 전달하기
자식 클래스에서 상위 클래스에 super 로 파라메터를 전달하고 싶은경우에는 상위 클래스 이름 뒤에 괄호로 파라메터를 넘겨줄 수 있습니다.
//상위클래스에 파라미터를 받는 생성자가 있는경우 :User(nicname) 처럼 넘길수 있음
class TwitterUser(nicname: String) : 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) { }
}
//인터페이스는 ()가 붙지 않음
class RadioButton : Button()
//주 생성자가 없는 클래스
open class OtherView {
constructor(context: Context?) { }
}
//주생성자가 없는 클래스이면 괄호() 가 없다
class OtherButton : OtherView {
constructor(context: Context?): super(context) { }
}
클래스 private 생성자로 만들기
외부에서 사용하지 못하도록 만들고 싶은경우 생성자에 private 를 붙일 수 있습니다.
//주 생성자에 private 하여 비공개 생성자를 생성할 수 있음
class Secretive private constructor()
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)
}
class MyButton : View {
//this 로 위임 가능
constructor(context: Context?) : this(context, null)
//super 로 위임 가능
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
}
*개인적으로 코틀린을 공부하면서 정리한 자료입니다. 수정 사항 및 이슈가 있는 경우 메일 부탁드립니다.
주생성자가 없는 클래스를 사용하는 방법 좀 알려주세요..
답글삭제