일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 메모리
- 프로세스
- 리액트네이티브
- reactnative
- 안드로이드
- 안드로이드 디자인 패턴
- MVVM
- React
- github
- cs
- CS지식
- 리액트
- 운영체제
- 앱 개발
- OS
- Operating System
- 디자인 패턴
- 디자인패턴
- 안드로이드 개발
- Database
- 앱
- 데이터베이스
- 액티비티
- 코틀린
- Android
- 개발
- 앱개발
- Kotlin
- db
- 스레드
- Today
- Total
Tech Log
[Android] SharedPreferences와 싱글톤 패턴 본문
프로젝트에서 안드로이드 SharedPreferences를 사용할 일이 많아서 종종 사용했었는데,
부끄럽지만 SharedPreferences를 싱글톤으로 사용한다는 것을 최근에 깨달았다 ...
지금이라도 싱글톤으로 사용하는 이유를 정리해보려고 한다.
1. SharedPreferences를 싱글톤으로 사용하는 이유
- 메모리 낭비를 줄이기 위함 : 매번 SharedPreferences 객체를 만들어서 메모리를 낭비하는 것보다 효율적으로 사용할 수 있다.
- 중복되는 데이터 저장 방지 : 여러 곳에서 SharedPreferences의 데이터에 접근하여 데이터를 저장한다면, 동일한 데이터가 중복으로 저장될 수 있다. 이를 방지하기 위해 싱글톤으로 사용한다.
- 코드 중복 방지 : SharedPreferences 객체를 생성하는 코드를 매번 작성하지 않아도 되어 코드 중복 작성을 방지할 수 있도록 한다.
SharedPreferences는 앱의 전역에서 사용되는 경우가 많으므로 싱글톤으로 생성하여 관리하는 것이 낫다.
앱의 전역에서 사용하는데 싱글톤으로 생성하지 않는다면, 위에서 나타난 문제들을 야기할 수 있다.
2. 싱글톤으로 사용 방법
class Preferences(context: Context) {
private val prefs = context.getSharedPreferences("pref_name", Context.MODE_PRIVATE)
fun getString(key: String, defValue: String): String {
return prefs.getString(key, defValue).toString()
}
fun setString(key: String, value: String) {
prefs.edit().putString(key, value).apply()
}
}
SharedPreferences 객체와 SharedPreferences 데이터 사용 메소드를 위한 클래스를 생성한다.
메소드는 SharedPreferences 데이터를 저장하고 가져올 수 있도록 메소드를 만든다.
class MyApplication : Application() {
companion object{
lateinit var prefsManager : Preferences
}
override fun onCreate() {
prefsManager = Preferences(applicationContext)
super.onCreate()
}
}
SharedPreferences를 Activity보다 먼저 생성해야 다른 곳에 데이터를 넘겨줄 수 있다.
그러므로 애플리케이션이 생성될 때 SharedPreferences를 생성해야 한다.
이를 위해 SharedPreferences를 Application 클래스로 생성한다.
SharedPreferences를 companion object를 통해 싱글톤으로 생성하고,
onCreate() 메소드가 호출되기 전 SharedPreferences 객체를 초기화해준다.
초기화시, Application Context를 사용한다.
지금 SharedPreferences는 전역에서 사용하므로, Application Context를 사용한다.
만약 SharedPreferences를 전역에서 사용하지 않고 한 Activity에서 사용한다면,
당연하지만 싱글톤으로 생성하지 않고 Activity Context를 사용하는 것이 맞다.
전역으로 사용하는데 Activity Context를 사용한다면,
Activity에 대한 참조가 남게 되고 해당 Activity가 사용되지 않는데 참조되고 있을 수 있다.
이 경우 GC에 의해 수거되지 않아 메모리 누수가 발생할 수 있다.
<application
android:name=".MyApplication">
</application>
manifest 파일에 생성한 Application 클래스를 등록해줘야 한다.
MyApplication.prefsManager.setString("name", "a")
위와 같이 메소드를 사용해주면 된다.
참조
'Android > etc' 카테고리의 다른 글
[Android] Context (0) | 2023.03.28 |
---|---|
[Android] ViewModel 개념 (0) | 2022.08.23 |
[Android] Fragment 생명 주기 (0) | 2022.06.25 |
[Android] Jetpack (0) | 2022.06.21 |
[Android] SharedPreferences (0) | 2022.06.15 |