1) 생성자

fun main() {
    val user = User("김주연", 10)
    // user.name // name은 private 이므로 접근 불가
    println(user.age)

}

class User(private val name : String, var age : Int, var emotion:Int = 80){

}

 

 

참고) 코틀린 코드를 자바 코드로 바꿔서 보려면?

상단 바에서 Tools > Kotlin > Show Kotlin Bytecode

이후, Decompile

// User.java
package com.example.kotlin;

import androidx.compose.runtime.internal.StabilityInferred;
import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {1, 9, 0},
   k = 1,
   xi = 48,
   d1 = {"\\u0000\\u0018\\n\\u0002\\u0018\\u0002\\n\\u0002\\u0010\\u0000\\n\\u0000\\n\\u0002\\u0010\\u000e\\n\\u0000\\n\\u0002\\u0010\\b\\n\\u0002\\b\\t\\u0018\\u00002\\u00020\\u0001B\\u001f\\u0012\\u0006\\u0010\\u0002\\u001a\\u00020\\u0003\\u0012\\u0006\\u0010\\u0004\\u001a\\u00020\\u0005\\u0012\\b\\b\\u0002\\u0010\\u0006\\u001a\\u00020\\u0005¢\\u0006\\u0002\\u0010\\u0007R\\u001a\\u0010\\u0004\\u001a\\u00020\\u0005X\\u0086\\u000e¢\\u0006\\u000e\\n\\u0000\\u001a\\u0004\\b\\b\\u0010\\t\\"\\u0004\\b\\n\\u0010\\u000bR\\u001a\\u0010\\u0006\\u001a\\u00020\\u0005X\\u0086\\u000e¢\\u0006\\u000e\\n\\u0000\\u001a\\u0004\\b\\f\\u0010\\t\\"\\u0004\\b\\r\\u0010\\u000bR\\u000e\\u0010\\u0002\\u001a\\u00020\\u0003X\\u0082\\u0004¢\\u0006\\u0002\\n\\u0000¨\\u0006\\u000e"},
   d2 = {"Lcom/example/kotlin/User;", "", "name", "", "age", "", "emotion", "(Ljava/lang/String;II)V", "getAge", "()I", "setAge", "(I)V", "getEmotion", "setEmotion", "app_debug"}
)
@StabilityInferred(
   parameters = 0
)
public final class User {
   @NotNull
   private final String name;
   private int age;
   private int emotion;
   public static final int $stable = 8;

   public User(@NotNull String name, int age, int emotion) {
      Intrinsics.checkNotNullParameter(name, "name");
      super();
      this.name = name;
      this.age = age;
      this.emotion = emotion;
   }

   // $FF: synthetic method
   public User(String var1, int var2, int var3, int var4, DefaultConstructorMarker var5) {
      if ((var4 & 4) != 0) {
         var3 = 80;
      }

      this(var1, var2, var3);
   }

   public final int getAge() {
      return this.age;
   }

   public final void setAge(int var1) {
      this.age = var1;
   }

   public final int getEmotion() {
      return this.emotion;
   }

   public final void setEmotion(int var1) {
      this.emotion = var1;
   }
}
// Example2Kt.java
package com.example.kotlin;

import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;

@Metadata(
   mv = {1, 9, 0},
   k = 2,
   xi = 48,
   d1 = {"\\u0000\\b\\n\\u0000\\n\\u0002\\u0010\\u0002\\n\\u0000\\u001a\\u0006\\u0010\\u0000\\u001a\\u00020\\u0001¨\\u0006\\u0002"},
   d2 = {"main", "", "app_debug"}
)
public final class Example2Kt {
   public static final void main() {
      User user = new User("김주연", 10, 0, 4, (DefaultConstructorMarker)null);
      int var1 = user.getAge();
      System.out.println(var1);
   }

   // $FF: synthetic method
   public static void main(String[] args) {
      main();
   }
}

 

자바코드가 꽤나 길다는 것을 확인할 수 있다.

getter, setter 부터 시작해서, 코드가 길다.

 

 

2) 상속

  • 기본적으로 코틀린은 상속에 의해 닫혀있다 ( 상속 미권장 )
  • 키워드 open 상속 시 open 키워드 사용
  • 주 생성자 ( Primary Constructor )
  • 부 생성자 ( Secondary Constructor )
  • init { } : 클래스 내에서 가장 먼저 호출됨
fun main() {
    val user = User("김주연")
    val kid = Kid("아이", 3, "male")

}

// 기본적으로 코틀린은, 상속에 의해 닫혀있다.
// 상속을 권장하지는 않는다.

// 상속 시 키워드 , open 을 클래스와, 클래스 아규먼트의 prefix 로 붙여준다.
open class User(open val name : String, open var age : Int = 100){

}

// 주 생성자 ( Primary Constructor )
// class Kid constructor( ...
// constructor 생략 됨
class Kid(override val name: String, override var age : Int) : User(name, age){
    var gender : String = "female"

    // 클래스 내에서 가장 먼저 호출됨
    init {
        // init 호출 시점을 알면, 생성 시점에서 어떤 것을 초기화할 지 정할 수 있음
        println("초기화 중 입니다.")
    }

    // 부생성자 ( Secondary Constructor )
    constructor(name: String, age: Int, gender: String) : this(name, age){
        this.gender = gender
        println("부생성자 호출")
    }
}

 

 

init 블럭이 먼저 실행되고 부생성자가 호출된 것을 확인할 수 있다.

프래그먼트 초기화할 때, 클래스 내에서 초기화가 만들어진 시점보다 먼저 되어야하는 것들에 사용할 수 있다.

 

 

  • 코틀린 클래스의 특징

값을 생성할 때, constructor, property를 한 번에 설정 할 수 있다.

생성자 파라미터에 default value 넣을 수 있다.

초기화하는 방법에 주 생성자 뿐만 아니라, 부 생성자, init 블럭 이 있다.

init 이 호출된 후에, 부 생성자가 호출된다.

'안드로이드 앱(Kotlin|Java) > [2025~] 안드로이드 앱' 카테고리의 다른 글

Part0_Ch01_06 반복문  (0) 2025.01.24
Part0_Ch01_05 조건식  (0) 2025.01.24
Part0_Ch01_03 변수 ( val, var )  (0) 2025.01.24
Part0_Ch01_02 함수  (0) 2025.01.24
Part0_Ch01_01 오리엔테이션  (0) 2025.01.24

+ Recent posts