티라미수 코딩생활

[Kotlin] Data Class 에서의 var & val 본문

Programming/Android

[Kotlin] Data Class 에서의 var & val

Aosta 2022. 10. 31. 20:29

이번주, 업무 중 REST API 로 아이템 리스트를 내려받은 뒤, 내려받은 아이템들의 현재가치를 앱에서 계산해서 저장 및 활용해야 하는 상황이 있었다. 이 과정에서 너무나도 당연한데 깜빡 했던 내용이 있어서 남겨두려 한다.

 

지금 담당하고 있는 프로젝트는 기본적으로 자바로 구현되어 있는데, Kotlin Data Class 를 쓰다보니 Java getter & setter 를 만드는게 싫다는 느낌이 들어 data class 만 Kotlin 으로 만들어 보고자 했다.

알고있는 Kotlin 의 Data Class 의 장점 중 하나는 자동적으로 getter & setter 를 구현해 주는 것.

 

data class Data(
    val name: String,
    val job: String,
    val point: String
)

간단한 예로, name 과 job 은 Api로 내려받고 point 는 나중에 별도로 set 해서 사용해야지 싶었는데, 프로젝트에서 data.getPoint() 는 나오는데 내가 원했던 data.setPoint()가 안나오는 것이다!

 

왜그런가 어리둥절 있다가 지인의 조언으로 바이트 코드로 돌려봤더니 field 값이 final 로 되어있다! 그리고 set method 자체가 없다. 

public final class Data {
   @NotNull
   private final String name;
   @NotNull
   private final String job;
   @NotNull
   private final String point;

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

   @NotNull
   public final String getJob() {
      return this.job;
   }

   @NotNull
   public final String getPoint() {
      return this.point;
   }

	//...//

}

 

여기서 data class 의 val point 를 var point 바꾸고 다시 바이트 코드를 확인해보니, 이제서야 setPoint 가 구현되어 있고 private String point 로 final 이 빠져 있다!

data class Data(
    val name: String,
    val job: String,
    var point: String
)

 

public final class Data {
   @NotNull
   private final String name;
   @NotNull
   private final String job;
   @NotNull
   private String point;

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

   @NotNull
   public final String getJob() {
      return this.job;
   }

   @NotNull
   public final String getPoint() {
      return this.point;
   }

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

	 //...//
}

 

간단한 실수지만 이로 인해 요구사항 구현 로직을 불필요하게 변경할 수도 있었다는 생각에 글을 남긴다.

Comments