본문 바로가기
강의 정리/Kotlin 프로그래밍 시작하기

[Kotlin] 생성자 호출 순서

by 이석준석이 2021. 12. 5.

스포 

  1. 주 생성자 (Primary Constructor) 호출
  2. Init 블록 호출
  3. 보조 생성자 (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 를 이용해서 주 생성자를 호출해야한다.
    • 이 때문에 아래와 같은 순서로 코드는 수행된다.
      1. 주 생성자를 통한 값 할당
      2. 부 생성자 내부 코드 호출
// 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);
   }
}