돌아오신 것을 환영합니다
이번 강의에서는 뷰 모델 클래스를 설정해 볼 것입니다
그러므로 클래스가 어떤 특정 유형이라고 설정할 것인데
이 것이 기본적인 상속의 의미입니다
다른 강의를 통해 상속에 대해 알아볼 것인데
지금은 예시를 보면서 특정한 역할을 달성하기 위해 정돈된 코드와
클래스라고 하도록 하겠습니다
좋습니다
지금까지는 모든 것을 관리해 주는 이 MainActivity.kt 라는 클래스 파일이 있었는데
이제는 뷰 모델을 이용해서 아주 깔끔하게 분리할 수 있습니다
이제 여기로 가서 새 Kotlin 클래스/파일을 만들며
CounterViewModel이라고 이름 짓는데
ViewModel이 이름에 들어가기만 하면 됩니다
클래스 이름이 무엇이든 말입니다
이 클래스는 기본적으로 counting(셈)에 대한 것이며
기본적으로 뷰와 모델의 관리이기 때문에 이렇게 이름 짓습니다
그러므로 CounterViewModel 클래스로 이름 지을 것이며
이대로 만들겠습니다
이제 MainActivity.kt의 맨 위로 가면 MainActivity가 ComponentActivity를
상속 받는 것을 볼 수 있습니다
상속에 관한 것은 나중의 강의에서 알아볼 것이나
MainActivity가 ComponentActivity처럼 작동하도록 만들었기 때문에 어떤 의미 인지를
파악하는 것이 중요합니다
이렇게 하면 override fun onCreate안의 super.onCreate라는 것이 생길 것인데
그렇지 않으면 볼 수 없는 것입니다
기본적으로 이 것들은 이 함수를 사용하려면
미리 정의되어야 하는 코드의 일부입니다
CounterViewModel은 ViewModel이라는 자료형이 될 것인데
ViewModel이라는 클래스가 있으며
우리의 클래스가 ViewModel이라는 자료형을 사용하거나 이 자료형이 되어야 합니다
이 ViewModel이라는 클래스는 ViewModel이 어떻게 동작해야 하고 어떤 일을 해야 하고
어떤 메소드를 사용할 수 있고 어떤 속성이 정의되어야 하는 지를
정의합니다
나중의 강의에서 알아볼 예정인
상속에 대해 더 자세히 알아보기 전에 무엇을 import했는지
보도록 하겠습니다
보시는 것처럼 lifecycle.viewModel이 import되었는데
androidx 패키지에 들어있으며 이제 프로그램 안에서 사용할 수 있습니다
ViewModel 클래스에서 필요한 것으로는
우선 숫자의 셈을 저장할 변수입니다
mutable state(가변적인 상태)를 사용해서 count 데이터를 관리할 것인데
이전에 mutable state(가변적인 상태)를 사용해 보았지만 이번에는 remember를 사용하지 않고
private 키워드를 사용한 val count를 사용하는 데
private 키워드를 사용한 변수는 해당 클래스 안에서만 존재하거나
해당 클래스 안에서만 접근이 가능하며 클래스 외부에서는
접근이 불가능합니다 또한 변수 이름 앞에 _를 붙이는 것이 관습이며 이를 통해 이 변수가
private 변수인 것을 쉽게 알 수 있습니다
이 것이 _의 의미입니다
이 변수를 mutableStateOf로 설정할 것인데
제가 원하는 mutableStateOf를 제안하지 않기 때문에
mutableStateOf를 입력하겠습니다
그리고 값을 0으로 지정해서 int(정수) 자료형으로
만들도록 하겠습니다
이제 mutableStateOf를 import하면
보시는 것처럼 import들의 가장 위에 import되었습니다
말씀드린 것처럼 count 변수는 private입니다
그러므로 이 ViewModel 안에서만 접근할 수 있는데
아주 좋은 활용이지만
이를 외부로 노출하고 싶다면,
즉 외부에서 counter 변수에 접근하고 싶다면,
예를 들어 사용자 인터페이스가 counter 변수에 접근해서 현재 상태의
값을 알고 싶다면, 불변 상태로 count를 노출해야 합니다
이렇게 하기 위해서는
val count를 MutableState〈Int〉로 지정하고
MutableState를 import한 뒤 _count의 값이 무엇이든 지정해주면
됩니다
이제 count는 val 자료형이므로 외부에서 값을 변경할 수 없습니다
한 번 설정되면 그 것이 값이 될 것입니다
하지만 state(상태)에 따라서는 유동적일 수 있습니다
_count의 값이 외부에서 접근할 수 있는 노출된 변수인 count의
값이 될 것인데
이 곳에서 계산을 하는 로직을 입력하겠습니다
그렇다면
increment와 decrement함수가 있는데
다른 함수나 파일 등에서 복사해서
이 곳에 붙여 넣는데
노출된 count 변수가 아닌
이 _count 변수를 수정하겠습니다
증가 시키거나 감소 시킬 때 이 _count가
바뀔 것입니다
기본적으로
외부에서 접근 가능한 변수가 아니라 private인 변수를 수정해야 하며
그 값은 여기에 저장됩니다
이렇게 해야 누군가 접근할 때 어떤 일이 일어나야 하는지 수정이 가능하기 때문입니다
이 외에도 일어날 수 있는 많은 일을 지정할 수 있습니다
이 경우에는 다소 제 멋 대로인 것처럼 보일 수 있는데
그렇게 하는
이유는
내부 변수인 private 변수 자체가 외부에 직접 노출되는 것이 아니라
그 값만이 외부에 노출될 수 있는 방법입니다
좋습니다
이제 MainActivity를 정리하려면
카운터 앱의 MainActivity에서 함수 로직을 지우고
CounterViewModel을 이 곳에 전달해야 합니다
그러므로 CounterViewModel 자료형인 viewModel 을 전달합니다
그러면 예를 들어 우리가 표시할 것을 수정하기 위해 viewModel을 이용할 수 있습니다
count.value를 표시하는 대신에
이 count 변수는 지워도 됩니다
Column만 있을 것인데
count.value가 없지만
viewModel.count.value를 사용할 수 있습니다
viewModel인데 여기서 l을 빠트렸습니다
viewModel.count.value입니다
increment 함수도 동일합니다
즉 viewModel.increment와 viewModel.decrement가 되어야 합니다
이렇게 하면 우리가 사용하는 함수는
이 곳의 함수들입니다
private 변수 대신 이 변수에 접근하며 수정하게 됩니다
이제 MainActivity의
onCreate 함수로 가면
Counter(카운터) 앱에 전달할 수 있는 뷰 모델이 필요하다는 것을 알 수 있습니다
이 viewModel은 어디서 가져 오는가 하면
setContent안에서 입니다
이 곳에서 viewModel 객체를 설정하는데
CounterViewModel자료형인
viewModel 객체가 될 것입니다
이 viewModel을 사용하려면 dependency(종속 항목)을 추가해야 하는데 마우스를 올려보면
add dependency on androidx.lifecycle:lifecycle-viewmodel-compose and import라는 것을 볼 수 있는데
이를 import하겠습니다
import가 완료될 때 까지 잠시 기다리면 이 import가 보이는데
androidx.lifecycle.viewmodel.compose.viewModel입니다
이제 이 viewModel을 TheCounterApp()에 전달할 수 있습니다
즉 viewModel 데이터 자료형인 객체가 필요한 컴포저블을 실행하거나
이 경우에는 표시하기 위해서 말입니다
이제 애플리케이션을 재실행하고 변수의 저장 여부를 살펴보겠습니다
지금까지 이를 위해 작업했는데
우리가 이렇게 작업한 중요한 이유 중 하나 입니다
이제 됐습니다
앱을 실행하기 위해 저는 컴퓨터를 재부팅 했는데
어쨌든 애플리케이션이 다시 동작합니다
MVVM의 형태로
말입니다
최적화된 형태라 할 수 있는데 조금 증가 시킨 후 스마트폰을 회전 시켜보겠습니다
사용자 인터페이스를 새로 고침 하여 모든 것을 리빌드 하였음에도
상태는 유지되어서
5라는 숫자가 여전히 유지됩니다
이번 강의의 핵심은 MVVM이 상태의 유지를 도와준다는
것입니다
MVVM에서 M(모델) 부분인 데이터 부분에서 보면 더욱 이해가 쉽지만
현재 우리가 다룬 것은 VVM(뷰, 뷰 모델)부분입니다
그러므로 이 부분을
정확히는
아니지만 M 부분인 모델이라 할 수 있으며 모델은 우리가 따로 설정해야 하는 별개의 클래스입니다
그리고 뷰에 해당하는
뷰에 해당하는 MainActivity가 있는데
화면을 관리합니다
기본적으로 화면에서 보이는 것들 말입니다
그리고 데이터와 사용자 인터페이스 간의 소통을 관리하는 뷰 모델이 있습니다
좋습니다
이번 강의는 여기까지 입니다
다음 강의에서 뵙겠습니다