on
[Kotlin] 생성자 호출 순서
[Kotlin] 생성자 호출 순서
스포
주 생성자 (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); } }
from http://robin00q.tistory.com/106 by ccl(A) rewrite - 2021-12-05 16:01:24