Back-End (web)

[kotlin] property, backing field

햄과함께 2021. 2. 4. 19:21
320x100

kotlin에서는 필드가 아닌 프로퍼티를 정의한다고 합니다. 

val name: String = "" // 불변
var name: String  // 가변

프로퍼티는 var, val로 선언할 수 있습니다.

var는 가변변수로 값을 변경할 수 있습니다.

val는 불변변수로 값을 변경할 수 없습니다.

 

java에서는 getter, setter를 보통 get필드이름. set필드이름 이라는 함수명으로 개발자가 직접 만들어 줬어야 합니다.

kotlin에서는 프로퍼티에 getter, setter를 정의할 수 있습니다.

data class MyTest (
    val name: String
) {

    val fullName: String
        get() = "full $name"

    var diffName: String = ""
        get() = field
        set(value) {
            field = "diff $value"
        }
}

getter, setter는 위와 같이 정의할 수 있습니다.

backing field 값은 getter, setter 함수 내에서 field 로 접근 가능합니다.

val는 불변 값으로, 프로퍼티 선언 시 초기화를 해주어야 합니다.

name은 생성자에서 제공을 받기 때문에 초기 값을 지정해주지 않아도 됩니다.

 

fullName은 불변 값이고 생성자에서 값을 제공받는게 아니기 때문에 선언 시 초기화 값을 세팅해 주었어야 합니다.

하지만 코드에서는 초기화가 되어있지 않은데 그 이유는 backing field가 없기 때문입니다.

fullName 프로퍼티는 getter는 있고 setter는 없습니다. 또한 초기화 값도 없기 때문에 backing field는 존재하지 않습니다.

backing field가 없기 때문에 getter에서도 field 변수로 backing field 로 접근할 수 없습니다.

 

kotlin에서는 getXXX, setXXX 함수를 비추하기 때문에 항상 다른 값에 의해 계산되어 결정되는 값들은 fullName과 같이 getter만 있는 프로퍼티를 생성해줍니다.

 

// MyTest bytecode decompile to java
public final class MyTest {
   @NotNull
   private String diffName;
   @NotNull
   private final String name;

   @NotNull
   public final String getFullName() {
      return "full " + this.name;
   }

   @NotNull
   public final String getDiffName() {
      return this.diffName;
   }

   public final void setDiffName(@NotNull String value) {
      Intrinsics.checkNotNullParameter(value, "value");
      this.diffName = "diff " + value;
   }

   @NotNull
   public final String getName() {
      return this.name;
   }
   // ...
}

참고 : [IntellJ] Kotlin 코드를 java 코드로 확인하기

 

intellij 에서 MyTest 바이트코드를 java 파일로 디컴파일한 결과입니다.

필드는 name, diffName이 있고 모든 필드들은 private여서 직접 접근할 수는 없습니다.

name 필드는 getter(getName)가 있습니다.

diffName 필드는 getter, setter (getFullName, setDiffName) 가 있습니다.

getter만 있던 fullName 프로퍼티는 getter(getFullName)은 있지만 setter는 없고 필드 또한 없습니다.


참고 : kotlinlang.org/docs/reference/properties.html

320x100