스포
- 주 생성자 (Primary Constructor) 호출
- Init 블록 호출
- 보조 생성자 (Secondary Constructor) 호출
Kotlin 의 주 생성자 (Primary Constructor)
- 클래스 명 옆에 있는 옆에 괄호로 쌓여져있는 변수들을 주 생성자라고 한다.
- 클래스는 오직 하나의 주 생성자를 가질 수 있다.
- 자바로 디컴파일되면 생성자가 생성되는 모습이다.
// kotlin
class PrimaryClass(val a1: Int, val a2: Int)
// Decompiled Java
public final class PrimaryClass {
private final int a1;
private final int a2;
// getters..
public PrimaryClass(int a1, int a2) {
this.a1 = a1;
this.a2 = a2;
}
}
Kotlin 의 부 생성자 (Secondary Constructor)
- 주 생성자는 오직 하나만 가질 수 있기에, 목적에 따라 더 많은 생성자가 필요할 수 있다.
- 이러한 경우, 부 생성자를 사용한다.
- 주 생성자와 함께 부 생성자를 사용하는 경우, 무조건 this 를 이용해서 주 생성자를 호출해야한다.
- 이 때문에 아래와 같은 순서로 코드는 수행된다.
- 주 생성자를 통한 값 할당
- 부 생성자 내부 코드 호출
- 이 때문에 아래와 같은 순서로 코드는 수행된다.
// Kotlin
class PrimaryClass(val a1: Int, val a2: Int) {
constructor(a1: Int) : this(a1, 100) {
println("Secondary Constructor Called")
}
}
// Decompiled Java
public final class PrimaryClass {
private final int a1;
private final int a2;
public PrimaryClass(int a1, int a2) {
this.a1 = a1;
this.a2 = a2;
}
public PrimaryClass(int a1) {
this(a1, 100); // 주 생성자가 먼저 호출
String var2 = "Secondary Constructor Called"; // 부 생성자 내부 코드 호출
System.out.println(var2);
}
}
Kotlin 의 Init 블록
- 주 생성자의 값 할당 이후 호출된다.
// Kotlin
class PrimaryClass(val a1: Int, val a2: Int) {
init {
println("Init Block Called")
}
constructor(a1: Int) : this(a1, 100) {
println("Secondary Constructor Called")
}
}
// Decompiled Java
public final class PrimaryClass {
private final int a1;
private final int a2;
public PrimaryClass(int a1, int a2) {
this.a1 = a1;
this.a2 = a2;
String var3 = "Init Block Called"; // 주 생성자의 할당 이후 호출
System.out.println(var3);
}
public PrimaryClass(int a1) {
this(a1, 100);
String var2 = "Secondary Constructor Called";
System.out.println(var2);
}
}
'강의 정리 > Kotlin 프로그래밍 시작하기' 카테고리의 다른 글
[Kotlin] If 와 When 은 Expression 이다. (0) | 2021.12.05 |
---|