DolphaGo/TIL

[Kotlin] 코틀린에서 value type, function type 사용 시 주의사항

Opened this issue · 1 comments

코틀린을 가볍게 사용해보면서 function과 value 지정이 굉장히 자유롭다고 생각을 했다.
즉, function <-> value 형태로 자유롭게 바꿔도 된다고 생각했지만, 그것은 착각이었음을 알게 되었다.

data class MyTestDto(
  val data : Object
) {
    var reason: String? = null
}

위와 같은 상황에서 객체 초기화 이후에 validation을 각각 진행한다고 생각해보자.
그렇게 되면, validation 결과에 따라, 처리가 되지 않는 이유에 대해서 reason이 세팅이 된다.

만약, 내가 다음과 같이 value 형태로 isValid를 짰다면 어떤 결과가 나올까?

data class MyTestDto(
  val data : Object
) {
    var reason: String? = null
    val isValid: Boolean = StringUtils.isBlank(reason)
}

위의 결과로는 isValid는 항상 true가 나온다.

  • 그 이유로는, val이기 때문에 초기 reason이 null이고, 이후로 값이 변하지가 않기 때문이다. (var여도 동일하다, 변수 레벨이기 때문이다)

validation을 태운 뒤 비즈니스 로직 때마다 reason이 비어있는지 아닌지 활용하고 싶다면, 다음과 같이 function을 써야한다.

data class MyTestDto(
  val data : Object
) {
    var reason: String? = null
    fun isValid(): Boolean = StringUtils.isBlank(reason)
}

만약 value 형태로 작성하고 싶다면, 다음과 같이 getter를 이용하면 된다.

val isValid: Boolean
  get() = StringUtils.isBlank(reason)

하지만, 의미상 function이 맞기에, 위와 같은 상황에서는 function을 사용하도록 하자.

image

출처: 이펙티브 코틀린