DolphaGo / TIL

TIL & issues
0 stars 1 forks source link

[Kotlin] get() 사용 시 주의할 점 #117

Open DolphaGo opened 2 years ago

DolphaGo commented 2 years ago

다음과 같은 코드가 있다고 가정해보자.

data class Member(
    val name: String,
    val age: Int
) {
    val say: String
        get() {
            println("자기 소개를 하겠습니다.")
            return "안녕하세요. 저는 $name 입니다. 나이는 $age 살 입니다."
        }
}

내가 만약 여기에서 member.say를 호출하면, 과연 몇 번 실행될까? 호출 수만큼 실행한다.

 @Test
fun test() {
    // given
    val member = Member("DolphaGo", 30)

    // when
    println(member.say)
    println(member.say)
    println(member.say)
}

실행 결과는 다음과 같다.

자기 소개를 하겠습니다.
안녕하세요. 저는 DolphaGo 입니다. 나이는 30 살 입니다.
자기 소개를 하겠습니다.
안녕하세요. 저는 DolphaGo 입니다. 나이는 30 살 입니다.
자기 소개를 하겠습니다.
안녕하세요. 저는 DolphaGo 입니다. 나이는 30 살 입니다.

이미 계산된 값인데, val로 parameter도 변경되지 않는 상태라면, 굳이 자기소개를 하겠습니다. 라는 로직을 한 번 더 탈 필요가 없다.

이를 function으로 만들어서 아예 변수레벨로 넣자. 즉 다음과 같이 개선할 수 있다.

data class Member(
    val name: String,
    val age: Int
) {
    val say: String = myFunc()

    private fun myFunc(): String {
        println("자기 소개를 하겠습니다.")
        return "안녕하세요. 저는 $name 입니다. 나이는 $age 살 입니다."
    }
}
  @Test
  fun test() {
      // given
      val member = Member("DolphaGo", 30)

      // when
      println(member.say)
      println(member.say)
      println(member.say)
  }

실행 결과는 다음과 같다.

자기 소개를 하겠습니다.
안녕하세요. 저는 DolphaGo 입니다. 나이는 30 살 입니다.
안녕하세요. 저는 DolphaGo 입니다. 나이는 30 살 입니다.
안녕하세요. 저는 DolphaGo 입니다. 나이는 30 살 입니다.

첫 실행시에만, 함수가 실행되고, 이후 값은 변수 레벨에 들어가게 되니, 불필요한 자기 소개를 하겠습니다. 라는 로직을 타지 않는다.