Android/Kotlin

[Android, Kotlin] SharedPreferences

겨울시인 2022. 4. 20. 10:23

1. SharedPreferences 가 뭐야?

간단하게, 앱에서 데이터를 저장하는 방법중에 하나로 앱 내부 DB 라 말할 수 있다.
SharedPreferences는 간단한 값을 저장할 때 주로 사용하는데 이러한 값들이 매번 저장될 때 마다 DB를 사용하게 되면 복잡하기 때문에 단순한 데이터를 Save/Load 하는데 사용한다고 생각하면 된다.
앱 내부에 xml 파일로 저장이 되며 데이터와 함께 설정된 keyValue 를 통해 Save/Load 할 수 있다.
데이터의 보존은 앱이 삭제되기전까지는 유지된다.

 
 

2. 기능 구현

  • EditText 를 만들어 text 입력 후, 화면을 닫았다가 다시 열어도 입력 text가 그대로 유지될 수 있도록 해보자.
    (SharedPreferences 를 쓰지 않는 일반적인 경우, text가 저장되지 않아 사라진다)

 
 

3. Android Studio에서 기본 프로젝트(with empty activity) 생성하자!

생성시 'Empty Activity'로 기본 생성

 
 

4. ViewBinding 사용을 위한 build.gradle 설정

  android {
          // 뷰 바인딩 옵션 활성화
          viewBinding {
              enabled = true
          }
      }

 
 

5. activity_main.xml

Text를 입력 받기 위한 EditText 하나를 만들어 놓자.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    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"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:textColor="#000000"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

 
 

6. MainActivity.kt

  • saveData() 메소드를 만들어 액티비티가 종료되는 onDestroy() 에서 호출 : Text 저장
  • loadData() 메소드를 만들어 액티비티가 시작되는 onCreate() 에서 호출 : Text 불러오기

SharedPreferences

  • Save : SharedPreferences 인스턴스 -> edit()로 수정모드 set -> put 메소드 with Key -> apply()
  • Load : SharedPreferences 인스턴스 -> get 메소드 with Key
class MainActivity : AppCompatActivity() {

    private var mBinding:ActivityMainBinding? = null
    private val binding get() = mBinding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 저장된 데이터를 로드
        loadData()
    }

    private fun saveData() {
        val pref = getSharedPreferences("pref",0)
        val edit = pref.edit() // 수정 모드
        // 1번째 인자는 키, 2번째 인자는 실제 담아둘 값
        edit.putString("name", binding.etHello.text.toString())  
        edit.apply() // 저장완료
    }

    private fun loadData() {
        val pref = getSharedPreferences("pref",0)
        // 1번째 인자는 키, 2번째 인자는 데이터가 존재하지 않을경우의 값
        binding.etHello.setText(pref.getString("name","")) 
    }

    // 해당 액티비티가 종료되는 시점이 다가올때 호출
    override fun onDestroy() {
        super.onDestroy()
        //저장된 데이터를 저장
        saveData()
    }
}

 
 

7. 실행결과

원하던 대로 EditText에 입력한 text 값이 화면을 내렸다 다시 올려도 SharedPreferences 를 참조하여 정상적을 불러온다.

참고 : 일반적으로 SharedPreferences 는 앱에서 전역으로 사용하기 때문에 싱글톤 패턴을 사용해서 어디서든 접근 가능하게
만드는 것이 좋다는데 이번 예제는 너무 간단해서 싱글톤 패턴을 활용하는 방법에 대해서는 추후 더 알아봐야겠다.

 
 

8. Reference

유튜버 홍드로이드님의 안드로이드 코틀린 앱 만들기 #7