세상을 바꾸는 개발자

[Kotlin] Assignment (=) , get() 의 차이 본문

안드로이드/Kotlin

[Kotlin] Assignment (=) , get() 의 차이

헬창코딩 2023. 7. 8. 17:16

평소에 잘 생각안하고 많이 사용하는 =, get()의 차이는 무엇 일까요 ?

먼저 코드로 알아보도록 하겠습니다! 

class Customer {
    private var _id = 1

    // get() 을 사용
    val id: Int
        get() = _id
        
    // = 을 사용    
    val id: Int = _id
}



블로그나 깃허브를 돌아다니다 보면 위와 같이 2가지 방법중 하나를 사용해서 가변성을 제안하는 코드가 있습니다

어떤 차이가 있을까요??? 

 

자바 코드로 변경해보면 답이 알 수 있습니다.

먼저 get() 을 사용한 코드를 자바로 변경하면

public final class Customer {
   private int _id = 1;

   public final int getId() {
      return this._id;
   }
}

보시면 아시겠지만, 자바로 코드를 변경하면 id의 필드가 만들어지지 않고 getId() 함수를 이용해서 _id 를 리턴하는 것을 볼 수 있습니다.
즉 get()을 사용하면 getter() 함수만 생성되고 필드는 생성되지 않습니다
다음으로는 assignment (=) 을 이용한 코드를 자바 코드로 변경해 보겠습니다.

public final class Customer {
   private int _id = 1;
   private final int id;

   public final int getId() {
      return this.id;
   }

   public Customer() {
      this.id = this._id;
   }
}

이번에는 assignement (=) 사용하니 id 라는 필드가 생성된 것을 알 수 있습니다

 

결론

get() 사용: :  필드는 생성하지 않고 getter() 를 이용해  리턴

assignement (=) 사용 : 필드 를 생성하는 동시에 해당 값을 할당하는 것입니다

 

+ 추가적으로 get() 을 사용하여 변수를 할당하면  코틀린의 장점인 스마트캐스트(smart-cast)가 되지 않습니다.

그 이유는 게터를 활용 하므로 사용하는 시점에 해당 값이 다른 결과가 나올 수 있기 때문입니다.

Comments