코틀린의 프로퍼티

Yerin·2023년 4월 18일

코틀린

목록 보기
8/11
post-thumbnail

코틀린의 프로퍼티 ?

자바에서는 field라는 용어를 주로 사용하지만, 코틀린에서는 프로퍼티라는 용어를 사용합니다.

프로퍼티 =
field(실제로 데이터가 저장되는 공간) +
getter(저장된 값을 읽을 때 호출되는 함수) +
setter(값을 저장하려고 할 때 호출되는 함수)

코틀린은 자바에서 field라고 불리는 클래스 내의 멤버 변수를 그냥 프로퍼티라고 부릅니다.


예시를 보며 설명해보도록 하겠습니다.

class Person {
    var name: String = "링링"
}

위의 코틀린 코드를 디컴파일하면 아래와 같습니다.

public final class Person {
   @NotNull
   private String name = "링링";

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

   public final void setName(@NotNull String var1) {
      Intrinsics.checkNotNullParameter(var1, "<set-?>");
      this.name = var1;
   }
}

보시다시피 코틀린의 property를 선언하면 getter/setter 함수가 자동으로 생성됩니다.
(물론 따로 정의 가능 - 아래서 다시 보여드리겠습니다.)


즉, 코틀린의 property는 java의 field를 좀 더 사용하기 편하게 만든 변수입니다.

fun main() {
    val person = Person()
    println(person.name)
}

아무튼간에 코틀린에서는 위와 같이 get() 메소드를 호출하지 않고 직접 프로퍼티에 접근합니다.
(물론 decomplie 해보면 getName()을 호출하고 있겠죠?)


자동 getter / setter 정의 ?

그렇다면 코틀린에서는 프로퍼티를 선언하면 무조건 getter setter가 생성되느냐?

class Person {
    val name: String = "링링"
}
public final class Person {
   @NotNull
   private final String name = "링링";

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

눈치채셨을지 모르겠지만, val은 불변이기 때문에 setter가 자동생성되지 않습니다.
setter를 강제적으로 정의하려고 하면 오류가 발생합니다.


Backing Field ..?

class Person(val name: String, age: Int) {
    var age = age
        get() = field
}

코틀린에도 위와 같이 field 가 존재하는데요, 이 field는 프로퍼티의 실제 값을 저장하는 변수를 의마하며 코틀린에서는 뒷받침하는 필드, Backing Field라고 부릅니다.

위의 이미지를 확인해보면 알겠지만 그냥 get에 field를 넣으면 중복 getter 라는 warning이 뜹니다.


그렇다면 이 field 키워드는 왜 필요할까요..?
바로 재귀를 막기 위함입니다.


마지막으로 custom getter/setter를 사용하면 다음과 같이 됩니다.
근데 저는 아직까지는 잘 사용하지 않는 것 같습니다. ㅎㅎ

class Person(val name: String, age: Int) {
    var age = age
        get() = field * 10
        set(value) {
            field = value * 10
        }
}

fun main() {
    val person = Person("링링", 10)
    println(person.name + person.age.toString())
} // 출력 : 링링100
profile
𝙸 𝚐𝚘𝚝𝚝𝚊 𝚕𝚒𝚟𝚎 𝚖𝚢 𝚕𝚒𝚏𝚎 𝙽𝙾𝚆, 𝙽𝙾𝚃 𝚕𝚊𝚝𝚎𝚛 !

0개의 댓글