코린이 탈출기

chapter 9.6 - sharedPreferences 본문

이전 글을 보고 코드를 따라 해 보셨다면 지금까지 만들어온 앱들은 앱이 종료되는 순간 그동안 작성한 모든 데이터를 잃게 됩니다.

예를 들면 뒤로가기 버튼을 누르거나 전원을 종료한 경우를 말합니다.

이는 앱에 save 기능이 없기 때문입니다.

 

sharedPreferences는 전원 공급이나 앱의 종료 여부와 관계없이 데이터를 (반)영구적으로 보관하고자 할 때 사용하는 클래스입니다.

즉, 안드로이드 기기 내에 특정 변수를 저장하고 불러올 때 사용합니다.

 

예를 들면 자동 로그인을 체크하고 서버에서 내려주는 토큰 값을 기기에 저장해서 앱이 꺼졌다 켜진다 해도 로그인 상태를 유지하는 경우를 말합니다.

 

 

위와 같은 예시를 코드를 작성해서 보여드리겠습니다.

 

xml
패키지 만들기

단순 기능 수행을 담당하는 클래스들은 util 패키지를 만들어서 따로 관리하겠습니다.

클래스 만들기

패키지 내에 클래스를 만들겠습니다.

 

setter

설명을 위해 자동 로그인 상태를 유지하는 것을 메모장에 기록한 내용물을 저장하는 것으로 비유하겠습니다.

7번 줄과 같이 companion object 함수를 만든 이유는 지금 만든 클래스를 다른 코틀린 파일에서 사용하고 싶을 경우 변수를 따로 설정하여 생성자를 만들어 사용해야 합니다.

하지만 7번 줄을 추가하면 '클래스 명.추가기능( )'으로 편리하게 사용할 수 있습니다.

9번 줄의 변수는 sharedPreferences 이름을 정하는 것입니다.

예를 들면 메모장을 저장하기 위해서 이름을 정하는 것과 같습니다.

앞에 private를 사용하는 이유는 이 변수를 지금 화면에서만 사용하기 위해서입니다.

만약 private를 설정하지 않으면 나중에 MainActivity.kt에서 클래스의 추가 기능을 사용할 때 너무 많은 자동 완성이 떠서 헷갈릴 수 있기 때문입니다.

즉, 다른 화면에서 사용하지 않을 선택지는 줄여서 실수를 줄이기 위해서입니다.

11번 줄은 저장해 줄 데이터 항목의 명을 미리 설정하여 오타를 방지하기 위해 설정하였습니다.

자주 사용할 것 같은 이름을 미리 변수로 지정하여 자동완성으로 오타를 줄이기 위해서입니다.

13 ~ 16번 줄은 setter 함수를 만들어서 메모장의 파일을 저장하는 것입니다.

13번 줄은 이 화면을 사용해서 저장할 내용의 이름을 설정하고 상황에 따른 타입을 지정합니다.

15번 줄은 지금 화면에서 메모장을 열어달라는 의미로 메모장의 이름과 지금 앱에서만 사용한다는 의미(Context.MODE.PRIVATE)입니다.

16번 줄은 수정 모드로 어떤 항목에서 어떤 값을 저장할지를 설정합니다.

상황에 따른 값을 저장한다는 의미로 위에 설정한 저장할 내용의 이름을 넣어줍니다.

마지막으로 메모장의 저장 버튼과 같은 apply( )함수를 설정하면 저장이 완료됩니다.

 

 

 

<코드 정리>

companion object{

private val 변수 명1 = "메모장 이름"

private val 항목 명 = "항목 명"

fun set함수 명(이 화면에서 사용할 것, 저장할 값의 변수 : 상황 별 타입)  {

val 변수 명2 = context.getSharedPreferences(변수 명1, Context.MODE.PRIVATE)

변수 명2.edit().put타입(항목 명, 저장할 값 변수).apply()

} }

 

 

여기까지 작성하면 저장은 되지만 저장된 데이터를 불러오지는 못합니다.

저장된 데이터를 불러오는 getter 함수를 작성해보겠습니다.

getter

20번 줄은 아까 setter 함수와 유사합니다.

하지만 getter 함수는 메모장을 열어주기만 하면 되기 때문에 다른 재료가 필요 없습니다.

대신 데이터를 불러와야 하기 때문에 어떤 타입의 값을 불러올 것인지를 설정하는 리턴 타입을 명시해야 합니다.

22번 줄은 15번 줄과 동일합니다.

마지막으로 결과를 출력하기 위해 return을 작성합니다.

위의 변수에 저장된 데이터를 불러와서 어떤 항목을 부를지와 기본 값을 설정해줍니다.

기본 값이란 자동 로그인을 안 했을 경우 어떻게 처리할 것인지를 설정합니다.

위와 같이 false를 설정할 경우 자동 로그인을 설정하지 않으면 안 하겠다는 의미입니다.

 

 

 

<코드 정리>

fun get함수 명(이 화면에서 사용할 것) : 리턴 타입 {

val 변수 명3 = context.getSharedPreferences(변수 명1, Context.MODE.PRIVATE)

return 변수 명3.get타입(항목 명, 저장된 것이 없을 경우의 기본 값)

 

 

여기까지 작성하였으면 클래스를 완성하였습니다.

이제는 적용해주기 위해 MainActivity.kt로 가서 작성하겠습니다.

MainActivity.kt

자동 로그인 체크 박스의 설정이 바뀌었을 경우 어떻게 동작할 것인지를 설정할 것입니다. 13번 줄과 같습니다.

변경된 설정을 저장하기 위해 위에서 만들었던 클래스를 이용하겠습니다.

만든 클래스에 추가 기능을 사용하여 setter 함수를 불러 지금 화면에 지금까지 바뀐 설정을 저장합니다. 15번 줄과 같습니다.

마지막으로 getter 함수를 불러 화면이 만들어지면 저장된 자동 로그인 여부의 값을 체크박스에 반영해줍니다. 18번 줄과 같습니다.

 

 

 

<코드 정리>

onCreate(~){

설정 부분 id.setOnCheckedChangeListener { buttonView, isChecked ->

클래스 명.set함수 명(this, isChecked)

}

설정 부분 id.isChecked = 클래스 명.get함수 명(this)

}

 

작성을 다 하고 에뮬레이터를 실행하면 자동 로그인의 체크박스는 원하는 상태로 저장되어 앱을 꺼도 전원을 꺼도 저장이 되어있습니다.

Comments