캡슐화는 객체의 필드에 직접 접근을 막는 방법이다.
우리가 객체를 캡슐화할 때 private인 내부 필드를 수정할 수 있도록 public 메소드들을 제공해야 한다.
캡슐화를 사용하면 다른 클래스가 이 내부 필드를 어떻게 조작할지 제어할 수 있다.
현재, 우리가 수정한 코드에서 viewModel.score.value를 사용하듯
모든 외부 클래스에서 score와 word 변수를 수정할 수 있다.
우리가 지금 만드는 이 앱에서는 문제가 없을 수 있지만, 출시용 앱에서는 ViewModel 객체의 데이터를 조작해야한다.
오직 ViewModel이 앱의 데이터를 수정해야한다.
하지만, UI controller가 데이터를 읽을 필요가 있고, 그래서 데이터 필드는 완벽한 private이 될 수 없다.
앱의 데이터를 캡슐화 하려면 MutableLiveData 객체와 LiveData 객체를 사용해야 한다.
MutableLiveData, LiveData 차이점
ㄱ. MutableLiveData 객체 안의 데이터는 바뀔 수 있다.
ViewModel 안에서 데이터는 수정 가능해야 하고, 그래서 MutableLiveData를 사용해야 한다.
ㄴ. LiveData 객체 안의 데이터는 읽을 수 있지만 바뀔 수 없다.
ViewModel 밖에서부터 데이터는 읽을 수 있어야 하지만 수정 불가능해야 한다.
그래서 데이터는 LiveData로 노출되어야 한다.
이 방법을 수행하기 위해서는 Kotlin의 backing property를 사용해야 한다.
(backing property가 정확히 무엇인지 어떻게 동작하는지는 모르겠지만 codelab에서는 짧게 설명해주고 있다.)
backing property는 정확한 객체가 아닌 getter에서 무언가를 리턴하도록 해준다.
(해석이 참 모호한데 getter에서 무언가를 리턴하도록 해준다는 것이 핵심인듯하다)
Add a backing property to score and word
1. GameViewModel에서 score를 private으로 만든다.
2. backing property에서 사용되는 naming convention을 따르기위해 score를 _score로 변경한다.
_score 속성은 이제 내부적으로 사용되는 게임 점수의 mutable 버전이다.
3. LiveData의 public 버전인 score를 만든다.
// The current score
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
4. 이제 Android Studio에서 초기화 에러가 보인다.
GameFragment에서 score는 LiveData 참조 변수이고 setter에 더 이상 접근할 수 없기 때문이다.
따라서, backing property를 사용해 custom getter를 만들어주었다.
val score: LiveData<Int>
get() = _score
5. GameViewModel에서 score의 참조를 내부의 변경 가능한 _score 로 바꿔준다.
6. word도 score처럼 바꿔준다.
'Android' 카테고리의 다른 글
안드로이드 스튜디오와 Gradle 버전의 호환성 이슈 (0) | 2023.02.28 |
---|---|
기존 프로젝트의 Java to Kotlin 전환 시 주의점 (0) | 2023.02.26 |
Codelab으로 LiveData 알아보기 - 2. Attach observers to the LiveData objects (0) | 2023.01.18 |
Codelab으로 LiveData 알아보기 - 1. Add LiveData to the GameViewModel (0) | 2023.01.17 |
Codelab으로 LiveData 알아보기 - 과정 소개 (2) | 2023.01.15 |