관리 메뉴

나만을 위한 블로그

[Kotlin] 안드로이드에서 코틀린으로 쉐어드 프리퍼런스 사용하는 법 본문

개인 공부/Kotlin

[Kotlin] 안드로이드에서 코틀린으로 쉐어드 프리퍼런스 사용하는 법

참깨빵위에참깨빵_ 2020. 10. 25. 17:26
728x90
반응형

이번 포스팅에선 안드로이드에서 코틀린으로 쉐어드 프리퍼런스를 사용하는 법을 작성하려고 한다.

먼저 쉐어드 프리퍼런스는 뭔지 간단히 정리하고 넘어가자.

 

SharedPreferences(이하 쉐어드)는 키밸류 쌍을 포함하는 파일을 가리킨다.

안드로이드에서 값을 저장하는 방법은 쉐어드, DB, 파일 등이 있는데, 이 중 쉐어드는 저장하고 꺼내오는 속도가 빨라서 간단한 값을 저장할 때 많이 쓰인다.

자동 로그인, 뭔가를 소개하는 액티비티를 처음 앱에 들어왔을 때만 보여주고 두 번째 들어왔을 때는 보여주지 않는다던가 하는 때에 사용을 고려해볼 수 있는 것이다.

설명하자면 여러가지 더 많이 있지만 이 글은 쉐어드에 대해서 설명하는 글이 아니기 때문에 자세한 내용은 구글링하자.

 

먼저 앱에서 회원가입하는 페이지를 만들고, 여기서 아이디와 비밀번호를 입력 후 회원가입하면 입력한 내용들이 저장되도록 하는 상황을 예시로 들겠다.

그러려면 editText가 2개 있어야 하고 각 editText가 뭔지 설명하는 TextView 2개, 회원가입을 완료하기 위한 버튼 1개가 있어야 한다.

최대한 간단하게 만들어서 쉐어드를 익히는 것이 목적이기 때문에 적당히 만들었다. XML부터 보자.

 

<?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=".RegisterActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="회원가입"
        android:textSize="30sp"
        android:gravity="center"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="70dp"
        android:weightSum="1">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".3"
            android:gravity="end"
            android:text="아이디"
            android:layout_marginRight="30dp"/>

        <EditText
            android:id="@+id/register_id"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".5"
            android:hint="아이디 입력"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="20dp"
        android:weightSum="1">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".3"
            android:gravity="end"
            android:text="비밀번호"
            android:layout_marginRight="30dp"/>

        <EditText
            android:id="@+id/register_pw"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".5"
            android:hint="비밀번호 입력"/>

    </LinearLayout>

    <Button
        android:id="@+id/register_done"
        android:layout_width="170dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="40dp"
        android:text="회원가입"/>

</LinearLayout>
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_register.*

class RegisterActivity : AppCompatActivity()
{
    val TAG: String = "RegisterActivity"

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        register_done.setOnClickListener {
            val id = register_id.text.toString()
            val pw = register_pw.text.toString()

            val sharedPreference = getSharedPreferences("other", 0)
            val editor = sharedPreference.edit()
            editor.putString("id", id)
            editor.putString("pw", pw)
            editor.apply()
            
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
            finish()
            Toast.makeText(this, "회원가입이 완료됐습니다. 가입된 아이디 = $id", Toast.LENGTH_SHORT).show()
        }
    }
}

여기서 봐야 할 부분은 val shared 부분이다. 이 부분만 따로 떼서 보자.

 

val sharedPreference = getSharedPreferences("other", 0)
val editor = sharedPreference.edit()
editor.putString("id", id)
editor.putString("pw", pw)
editor.apply()

먼저 other라는 이름의 쉐어드를 만들고, MODE는 PRIVATE로 설정했다. 숫자 0을 쓰면 쉐어드를 MODE_PRIVATE로 설정한 것과 같은 효과를 낼 수 있다.

그 후 sharedPreference 객체를 edit()해서 val editor에 매핑한 뒤, 이 editor 변수를 참조해서 putString()을 호출해 키에 문자열, value에 text.toString()을 통해 가져온 문자열을 넣었다. 그 후 apply()를 호출해 쉐어드의 변동사항을 저장했다.

그럼 쉐어드에 아이디와 비밀번호가 제대로 저장됐는지 로그로 확인해보자. 둘 다 test로 저장할 것이다.

사용한 로그 형태는 아래와 같다.

Log.e(TAG, "쉐어드에 저장된 아이디 = " + sharedPreference.getString("id", ""))
Log.e(TAG, "쉐어드에 저장된 비밀번호 = " + sharedPreference.getString("pw", ""))

 

 

둘 다 test라는 문자열로 저장되는 걸 볼 수 있다.

 

그런데 쉐어드를 사용하는 방법은 이것이 끝이 아니다. 위에서 설명한 쉐어드 사용법은 자바의 쉐어드 사용법과 비슷하지만, 코틀린에는 특이하게 쉐어드를 사용할 수 있는 방법이 있다.

 

먼저 클래스를 2개 만든다. MyApplication과 PreferenceUtil 클래스를 만들어준다.

그 후 아래의 코드를 참고해 클래스를 작성한다.

 

import android.app.Application

class MyApplication : Application()
{
    companion object
    {
        lateinit var prefs: PreferenceUtil
    }

    override fun onCreate()
    {
        prefs = PreferenceUtil(applicationContext)
        super.onCreate()
    }
}
import android.content.Context
import android.content.SharedPreferences

class PreferenceUtil(context: Context)
{
    private val prefs: SharedPreferences = context.getSharedPreferences("other2", 0)

    fun getString(key: String, defValue: String): String
    {
        return prefs.getString(key, defValue).toString()
    }

    fun setString(key: String, str: String)
    {
        prefs.edit().putString(key, str).apply()
    }

}

그 후 매니페스트의 <application> 태그 안에 MyApplication을 name 속성의 값으로 넣는다.

내 경우는 따로 SharedPref라는 패키지를 만들고 그 안에 MyApplication을 만들어서 저렇게 작성했지만, 패키지에 넣지 않았다면 앞의 SharedPref를 삭제하면 될 것이다.

 

<application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        .
        .
        .
        android:name=".SharedPref.MyApplication"

 

위처럼 처리했다면 RegisterActivity는 이렇게 바꿀 수 있다.

 

class RegisterActivity : AppCompatActivity()
{
    val TAG: String = "RegisterActivity"

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        register_done.setOnClickListener {
            val id = register_id.text.toString()
            val pw = register_pw.text.toString()

            MyApplication.prefs.setString("id", id)
            MyApplication.prefs.setString("pw", pw)
            
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
            finish()
            Toast.makeText(this, "회원가입이 완료됐습니다. 가입된 아이디 = $id", Toast.LENGTH_SHORT).show()
        }
    }
}

이렇게 해도 other2라는 이름의 쉐어드 파일에 아이디, 비밀번호가 저장되는 것을 확인할 수 있다.

방법이 2개니 필요한 상황에 맞게 쉐어드를 선언해서 사용하면 될 듯하다.

반응형
Comments