필드(Field)와 프로퍼티(property)란?

최윤정·2024년 3월 14일
1

Kotlin

목록 보기
4/5

코인액을 읽다가 BackingField라는 단어가 나왔다.
backingField가 나오기 전에 먼저 필드와 프로퍼티에 대해서 알고 가자!

kotlin은 Java와는 다르게 필드라고 안하고 프로퍼티라고 한다.
그렇다면 프로퍼티란 무엇일까?

코인액에 나온 말을 빌려오자면
코틀린 프로퍼티는 자바의 필드와 접근자 메서드(get,set)을 완전히 대신한다고 한다.
코틀린 클래스의 프로퍼티 = 자바의 필드 라고 대충 생각하고 사용을 했었는데 그게 아니였다.

용용선생님 께서 그러셨다.
필드와 접근자 메서드를 모두 합친게 프로퍼티라는 말이 아니다.

프로퍼티는 필드의 역할도, 접근자 메서드의 역할도 할 수 있다는 것이다!!
kotlin에선 자바의 필드를 뒷받침하는 필드(backing field)라고 부른다.

Field와 Property

프로퍼티는 객채가 갖는 상태와 같은 속성이고, 필드는 프로퍼티의 실제 값이라는 차이가 있다.
쉽게 예제를 들어서 설명을 해주겠다.

java로
@Getter
@Setter
public class Person{
	private String name;
    private int age;
    private String phoneNum;
    }

이렇게 클래스를 만들었을 때 name, age, phonNum은 프로퍼티가 되는 것이고, 실제로 들어가는 값이 필드가 된다고 보면 된다.
프로퍼티는 정적이지만 필드는 동적이다. 내가 변수 이름을 직접 name -> FirstName이라고 다른 곳에서 바꿔서 쓰지 않지만 person("yoon","","") person("choi","","") 이런식으로 필드는 동적이기 떄문이다.


자바에서는 기본적으로 맴버 변수를 선언할 때 get,set을 다 만들어 줘야 된다.
그리고 이 맴버변수를 다룰 때도 String name = person.getPerson(); 요런식으로 get,set을 이용해서 읽고, 변경한다. 따라서 kotlin에서 처럼 직접적으로

이렇게 바꿀 수 없다는 것이다. 아래의 kotlin을 java로 바꾼 예시를 보자

따라서 kotlin은 기본적으로 val name = person.name이나 person.name = "밍이" 이렇게 직접적으로 맴버 get,set을 사용하지 않고도 변수를 다룰 수 있다.


kotlin
val name:String = "yoon"
java
private final String name = "yoon";

public final String getName(){return this.name = "yoon"}

위의 두개는 똑같다. get만 만들어 진 이유는 kotlin을 val로 선언했기 떄문에 변경할 수 없다. 따라서 get과 final로 java가 만들어진 것 이다.


kotlin도 커스텀Getter를 통해서 프로퍼티를 정의할 수 있다.

class RecordDream(var user: String, var count: Int) {
    val record get() = user + count
}

이런 식으로 만들면

public final class RecordDream {
   @NotNull
   private String user;
   private int count;

   @NotNull
   public final String getRecord() {
      return this.user + this.count;
   }

   @NotNull
   public final String getUser() {
      return this.user;
   }

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

   public final int getCount() {
      return this.count;
   }

   public final void setCount(int var1) {
      this.count = var1;
   }

   public RecordDream(@NotNull String user, int count) {
      Intrinsics.checkNotNullParameter(user, "user");
      super();
      this.user = user;
      this.count = count;
   }
}

이렇게 디컴파일 된다.
보면 record는 get()으로 만들었기 때문에 필드가 없고 접근자 메서드 get만 존재하는 프로퍼티로 만들어 진 것을 확인 할 수 있다.

따라서 내가 이해 한것은

private final String name = "yoon";
->필드

public final String getName() {
   return this.name;
}
->접근자 메서드

이것이다.

여러 예제를 만들다가 궁금해진 게 있다.

class RecordDream(var user: String, var count: Int) {
    val record get() = user + count
}

class RecordDream1(user: String, count: Int) {
    val record get() = user + count
}

이 두개의 차이는 무엇일까?
다음 글에서 계속 설명하겠다.

참고

profile
옴뇸뇸

0개의 댓글