Tech Log

[Android] SharedPreferences와 싱글톤 패턴 본문

Android/etc

[Android] SharedPreferences와 싱글톤 패턴

yuhee kim 2023. 3. 27. 08:00

프로젝트에서 안드로이드 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
Comments