🧭 코틀린의 생성자(Constructor)
코틀린에서는 하나의 주(primary) 생성자와 여러 개의 부(secondary) 생성자를 사용할 수 있다. 주 생성자는 클래스의 헤더로써 클래스의 이름과 동일한 이름을 사용한다.
만약 주 생성자에 어노테이션이나 가시성 변경자(visibility modifiers)가 없다면, 생성자 키워드는 생략 가능.
// constructor 키워드를 사용한 모습
class Person constructor(firstName: String) { /* . . . */ }
// constructor 키워드를 생략한 모습
class Person(firstName: String) { /* . . . */ }
보통 주 생성자는 클래스를 초기화할 때 주로 사용하는 간략한 생성자로, 클래스 본문 밖에 정의한다.
반면 부 생성자는 클래스 본문 안에 정의한다.
또한 코틀린에서는 초기화 블록(Initializer block : init { /* . . .*/ } )을 통해 초기화 로직을 추가할 수 있다.
주 생성자(Primary constructor)
코틀린에서는 클래스 이름 뒤에 고는 괄호(” ( ) ”)로 둘러 쌓인 코드를 주 생성자라고 한다.
주 생성자는 두 가지 목적으로 사용된다.
- 생성자 파라미터를 지정하는 것
- 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의하는 것.
아래의 1번, 2번, 3번은 모두 같은 클래스의 생성자를 정의하는 것이다.
// 1번 방법
class User constructor(_nickname: String){
val nickname: String
init {
nickname = _ nickname
}
}
// 2번 방법
class User (_nickname: String){
val nickname = _nickname
}
// 3번 방법
class User (val nickname: String)
이 중 3번의 방식이 가장 간단하다.
함수 파라미터처럼 생성자 파리미터에도 아래와 같이 default값을 정의할 수 있다.
class User (val nickname: String, val isSubscribed: Boolean = true)
클래스의 인스턴스를 만들때에는 자바와 달리 new키워드 없이 생성자를 직접 호출하면 된다.
val hyun = User("유저")
부 생성자(Secondary constructor)
위에서 언급했듯이 부 생성자는 클래스 본문 안에서 본문 안에서 정의되는 생성자이다.
아래와 같이 생성자가 2개인 View 클래스가 있다고 가정하겠다.
open class View {
constructor (ctx: Context) { // 부 생성자
/* . . . */
}
constructor(ctx: Context, attr: AttributeSet) { // 부 생성자
/* . . . */
}
}
이 클래스를 확장하면서 아래와 같이 두 가지 방식으로 부생성자를 정의할 수 있다.
// 1번. super() 를 통해 상위 클래스의 생성자를 호출함.
class MyButton : View {
constructor (ctx: Context) : super(ctx) {
// . . .
}
constructor (ctx: Context, attr: AttributeSet) : super(ctx, attr) {
// . . .
}
}
// 2번. this()를 통해 자기 자긴인 클래스의 다른 생성자를 호출함.
class MyButton : View {
constructor (ctx: Context) : super(ctx, MY_STYLE) {
// . . .
}
constructor (ctx: Context, attr: AttributeSet) : super(ctx, attr) {
// . . .
}
}
클래스에 주 생성자가 없다면 부 생성자는 반드시 상위 클래스를 초기화하거나 다른 생성자에게 생성을 위임해야한다.
부 생성자가 필요한 이유는 자바와의 상호 운용성과 팩토리 메소드에서 필요하기 때문이다.
Uploaded by N2T
'Kotlin > Basic' 카테고리의 다른 글
[Kotlin] 더블콜론(::) 참조 (0) | 2023.01.10 |
---|---|
[Kotlin] 지연 계산(lazy) 컬렉션 연산: Sequence (1) | 2023.01.10 |
[Kotlin] Scope Functions 정리 (0) | 2023.01.02 |
[Kotlin] 클래스 계층 정의 (0) | 2022.12.31 |
[Kotlin] 코틀린 프로퍼티와 필드(Properties and Fields) (1) | 2022.12.31 |