일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 다른 객체 리스트의 비교
- dagger error
- edittext 연결
- LifeCycle
- Kotlin
- 디자인 패턴 예제
- 아파치란
- 아파치 엔진엑스
- 이중for문 사용 안하기
- 변수
- 객체지향 프로그래밍 5가지 원칙
- Thread
- 안드로이드 스튜디오 인터넷 연결 확인
- 자바 스레드 예제
- java thread 예제
- apache란
- 안드로이드 스튜디오 custom dialog
- 안드로이드 스튜디오 반복되는 레이아웃 코드
- 안드로이드 스튜디오 커스텀 다이얼로그
- recyclerview item recycle
- AAC
- 안드로이드 스튜디오 인터넷 연결 안되어 있을 때
- 안드로이드 mvvm 예제
- java
- apache nginx
- hilt error
- 리사이클러뷰 아이템 재사용
- 안드로이드 스튜디오 style
- 안드로이드 스튜디오 tts
- 안드로이드 디자인패턴
- Today
- Total
Sam Story
뷰모델 (ViewModel) 본문
1. 뷰모델(ViewModel) 이란 ?
ViewModel 클래스는 라이프 사이클을 파악하여
UI 와 관련된 데이터를 저장하고 관리하기 위해 만들어 졌다.
ViewModel 클래스는 스크린 회전과 같은 구성 변경에서 데이터가 유지될 수 있도록 한다.
예제를 통해 바로 알아보도록 하자.
2. 예제
오늘 만들 예제는 간단하게 더하기 버튼을 누르면
텍스트뷰의 숫자가 +1 씩 증가하고 빼기 버튼을 누르면 숫자가 -1씩 감소하는
간단한 예제를 만들어서 진행해 볼 것이다.
먼저 MViewModel 이라는 ViewModel 클래스를 작성해 보자.
MViewModel class
package com.example.viewmodel_test
import androidx.lifecycle.ViewModel
class MViewModel : ViewModel(){
var result : Int = 0
// 숫자가 하나씩 증가하는 메서드
fun plus() : Int {
result += 1
return result
}
// 숫자가 하나씩 감소하는 메서드
fun minus() : Int {
result -= 1
return result
}
}
메인 액티비티 레이아웃
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:text="0"
android:layout_weight="1"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="0dp"
android:textSize="50sp"/>
<LinearLayout
android:layout_marginHorizontal="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/minusButton"
android:layout_margin="10dp"
android:text="빼기"
android:textSize="20sp"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/plusButton"
android:layout_margin="10dp"
android:text="더하기"
android:textSize="20sp"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
메인 액티비티
package com.example.viewmodel_test
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider
class MainActivity : AppCompatActivity() {
lateinit var mViewModel : MViewModel
lateinit var textView: TextView
lateinit var minusButton: Button
lateinit var plusButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 뷰모델 초기화
mViewModel = ViewModelProvider(this).get(MViewModel::class.java)
// 뷰 초기화
textView = findViewById(R.id.textView)
minusButton = findViewById(R.id.minusButton)
plusButton = findViewById(R.id.plusButton)
// 텍스트뷰의 텍스트 값 초기화
textView.text = mViewModel.result.toString()
// 더하기 버튼 클릭 리스너
plusButton.setOnClickListener {
textView.text = mViewModel.plus().toString()
}
// 빼기 버튼 클릭 리스너
minusButton.setOnClickListener {
textView.text = mViewModel.minus().toString()
}
}
}
실행 결과
더하기를 누르면 텍스트뷰의 숫자가 오르고 빼기를 누르면 텍스트뷰의 숫자가 감소하는걸 확인할 수 있다.
그런 후에 화면을 회전하게 되었을때 데이터가 어떻게 되는지 한번 확인해보자.
화면 회전 했을 때
회전하기 전의 데이터가 그대로 유지되는걸 볼 수 있다.
이러한 데이터가 유지되는것이 가능한게 바로 AAC ViewModel 이다.
그런데 화면 회전을 했을때 무엇이 변하길래 데이터 변화가 없게 하기위해서 AAC ViewModel을 사용하는가?
생명주기에 로그를 찍어서 화면을 회전했을때 생명주기가 어떻게 바뀌는지 확인해보자.
맨처음 액티비티가 onCreate() 가 호출되고 onResume() 까지 호출된다.
그런 다음 화면을 회전 했을때 onPause() 에서 onStop() , onDestroy() 까지 호출이 된 후에
다시 onCreate() 부터 onResume() 까지 호출이 된다.
결국 액티비티가 다시 만들어 지게 되는것인데 AAC ViewModel을 사용하여
이러한 상태변화에도 데이터를 유지할 수 있는것이다.
3. AAC ViewModel 과 MVVM 디자인 패턴에서의 ViewModel
AAC ViewModel을 공부하면서 가장 많이 본 주제인것 같다.
AAC ViewModel 과 MVVM 디자인 패턴에서의 ViewModel의 차이점이다.
이름은 같지만 둘은 완전히 다른 개념이다.
한눈에 표로 나타내면 위의 표처럼 볼 수 있다.
MVVM ViewModel 은 디자인 패턴에서 ViewModel의 역할에 관련된 클래스 이고
ViewModel은 UI 관련 데이터를 저장하고 관리하는 요소이자 라이브러리 이다.
MVVM 디자인 패턴의 ViewModle은 디자인 패턴을 공부하며 다시한번 포스팅 할 예정이다.
사실 이 차이를 이해하기 위해서는 디자인 패턴에 대한 이해도도 어느정도 필요로 하는 것 같았다.
이러한 AAC ViewModel 을 사용하여 다양한 상황에 맞게 사용하면 유용할 것 같다.
아래는 예제 깃허브 주소 입니다.
nam-su/ViewModelExample: AAC ViewModelExample (github.com)
'Android' 카테고리의 다른 글
룸 (Room) (0) | 2024.04.16 |
---|---|
라이브 데이터 (LiveData) (0) | 2024.04.13 |
라이프 사이클 (Lifecycle) (1) | 2024.04.02 |
데이터 바인딩 (Data Binding) (1) | 2024.04.01 |
레트로핏 (Retrofit) (0) | 2024.03.26 |