ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] 일반적인 접근 VS getter로 접근
    Mhwan's Study/JAVA & Kotlin 2021. 8. 21. 01:48

    kotlin에 대해 공부하다가 Kotlin에서는 변수등 필드에 대한 접근자(getter, setter)를 정의할 수 있는데, 이것과 일반적으로 변수 등의 필드에 접근하는 방식의 차이가 궁금했습니다. 제가 잘못 찾았을 수도 있지만, 둘의 차이가 적힌 블로그는 아직 보지 못한것 같군요..ㅠ

     

    간단하게 보면 변수 a는 일반적인 접근으로 sample의 v값을 가져옵니다. 그리고 b는 getter를 정의해 sample의 w를 가져옵니다. 이 둘의 차이가 무엇일까요? 그리고 언제 쓰면 좋을까요?

    우선 sample클래스에는 v, w라는 변수 모두 mutable한 변수로 3을 넣어줬습니다. 그리고 각각 두번 print를 해볼 것인데 a를 통해 v를 가져온 값을 프린트하고, v의 값을 10 증가시키고, 다시 a를 통해 v를 가져와 프린트합니다.

    실행결과

    이렇게 해보면 결과는 둘다 3이 나옵니다. 10을 증가시켰지만 a는 증가되지 않은걸 알 수 있습니다.

     

    그럼 getter로 가져오는 방식인 b로 w를 마찬가지로 테스트하면 어떻게 될까요?

    실행결과

    아까와 달리 달라진 결과인 3과 13을 볼 수 있습니다. 

    어떻게 이렇게 된걸까요? 디컴파일을 해보면 그 차이를 쉽게 알 수 있습니다.

    먼저 코틀린은 변수가 mutable이면 getter, setter 모두 자동 생성, immutable이면 getter만 자동으로 생성합니다. 이에 a, b모두 getter가 자동으로 만들어졌습니다.

    일반적인 접근인 a부터 보면 인스턴스내 변수로 만들어졌습니다. 그리고 a의 값을 정의할 때 생성자 내에서 v의 getter를 통해 한번만 가지고와 a에 3이란 값을 넣게 됩니다. 이후 외부에서 a를 접근 즉 getA()를 실행해도 매번 이미 정의된 3만 가지고 오게되는 것이고, 때문에 중간에 10을 더해도 값이 변하지 않은 것 입니다.

    getter인 b는 다릅니다. 먼저 a와 다르게 인스턴스 변수로 만들어지지 않고, getter 함수만 만들어졌습니다. 그리고 getter함수는 매번 test클래스에서 getW()를 통해 w를 가지고 오게 되고, 때문에 매번 w의 새로운 값을 가져오게 되므로, 중간에 10을 더하면 더해진 값을 갖고 올 수 있게 됩니다.

     

    어디에 쓰면 좋을까는 이미 모두 눈치채셨겠지만 매번 새롭게 업데이트된 값을 가져온다면 getter로만 정의하는게 좋습니다. 그게 아니고 해당 클래스의 생성때 값을 갖고 오고 싶다면 일반적인 접근으로 가지고 오면 되구요.

    댓글

Designed by Mhwan.