BOID

[iOS] UserDefaults객체를 사용하여 값 전달 - HoonIOS 본문

IOS 시작기

[iOS] UserDefaults객체를 사용하여 값 전달 - HoonIOS

HoonIOS 2021. 4. 7. 17:14
728x90

안녕하세요 HoonIOS입니다. :)

이번에는 코코아 터치 프레임워크에서 제공하는 UserDefaults객체로 값을 주고받는 방법에 대해 포스팅을 하겠습니다.

 

UserDefaults 특징 & 저장 가능 타입

- UserDefaults로 값을 저장하면 앱이 삭제되지 않은 이상 값은 사라지지 않는 반영구적으로 유지가 된다는 장점을 가지고 있습니다.

- 로그인 여부, 설정 정보등 간단한 것을 저장하는 경우가 많습니다.

- UserDefaults객체는 plist파일을 이용하여 값을 내부적으로 저장하는데 NSDate, NSString, NSNumber, NSData, NSArray, NSDictionary클래스 타입, 스위프트에서 제공하는 기본 자료형까지 객체에 그대로 저장할 수 있습니다.

 

* NSDate, NSString, NSNumber, NSData, NSArray, NSDictionary클래스 타입이란?

- Date에 연결되는 특정 시점의 표현으로  날짜를 비교하고, 두 날짜 사이의 시간 간격을 계산하고, 다른 날짜와 관련된 시간 간격에서 새 날짜를 만드는 메서드를 제공합니다.

- String에 연결되는 정적 문자열 객체로 NSString클래스 및 서브 클래스의 가변은 , 문자열 작업 검색, 비교하는 방법을 포함한 문자열을 수정하기 위한 API의 세트를 제공합니다.

- 스칼라 (숫자) 유형으로 값을 제공하기위해 wrapped 되어있는 객체입니다.

-  Data에 연결하는 정적 바이트 버퍼로 파일 처리 등에 이용하는 바이트 배열 클래스입니다.

- 객체 배열을 담는 컬렉션 중 하나입니다. Array로 쓰이고 있습니다.

- key - value짝의 정적은 collection중 하나로 Dictionary로 쓰이고 있습니다.

 

UserDefatults객체를 이용하여 값 전달의 예시

- 값을 저장 및 전환하는 버튼인 Done 코드를 봐보겠습니다.

* 코드 설명

- UserDefaults는 시스템에서 자동으로 생성하여 제공하는 단일 객체입니다. 이 객체의 인스턴스를 생성하기 위해서 직접 생성하는 게 아니라 UserDefaults.standard를 사용하여 읽어와야 합니다.

(. standard는 클래스 프로퍼티이므로 UserDefaults를 생성하지 않아도 사용을 할 수 있습니다.)

- ud.set(self.inputName.text, forKey: "Name")에서. set(_:forkey:) 메서드는 UserDefaults객체에 키랑 값을 저장하기 위해 서 사용하는 것으로 forkey 매개변수의 이름으로 키를 저장하고 forkey 앞의 매개변수로 값을 저장합니다.
( 이 예제에서는 Name, Alaram. StudyTime을 키로 저장했습니다. )

 

※ 주의 ※

- key을 저장할때 스펠링을 잘 기억해야 됩니다. 값을 불러올때 키를 통해 불러오는데 만약 키가 서로 안맞으면 값을 불러오지 않는 불상사가 일어납니다. ㅠㅠ

이제는 값을 저장했으니깐 읽어오는 부분을 구현해줘야겠죠? 이것도 AppDelegate와 마찬가지로 viewWillAppear(_:) 생명주기에 구현을 해줍니다. viewWillAppear에 구현해주는 이유도 같아요 ㅎㅎㅎ

 

* 코드 설명

- 똑같은 UserDefatults의 인스턴스를 가져오기 위해서 UserDefaults.standard를 통해 인스턴스를 가져옵니다.

 

- 저장된 값을 이제 빼오면 되는데 저장된 타입에 맞는 메소드를 사용하면 읽어온 값을 캐스팅할 필요가 없습니다. 
( 이 말은 뒤에 범용 데이터 타입을 사용하여 꺼내올 때 설명을 하겠습니다. ) 

- UserDefaults에 저장된 값을 불러오는 방법은 프로퍼티."저장한 값 타입"(forkey: "저장 키")

- 보시면 이상하게 string타입만 옵셔널 바인딩을 해줬고 다른 것은 해주지 않았습니다. 왜 그럴까요?

.

.

.

정답은 바로!!!

.

.

.

 UserDefaults객체에서 값을 읽어오는 메소드중에서 String 타입의 메소드만 반환 값이 옵셔널이므로 옵셔널 바인딩을 해주어야 합니다. 만약 아무 값도 저장이 되어 있지 않으면 nil을 반환하겠죠? :)  ( 너무나 당연한걸... )

 

- 여기서 만약 guard를 사용하지 않고 if를 사용한 이유는 무엇일까요?

그 이유는 값이 없어도 메소드가 종료가 되지 않게 하기 위해서입니다.
( guard일 겨우 nil이면 else를 타 return 해서 메소드가 종료되겠죠? )

- Bool타입이나 Double 타입의 메소드는 일반 타입(옵셔널이 아닌)으로 값을 반환하기 때문에 옵셔널 바인딩을 해줄 필요가 없습니다. 

 

* 만약 저장되어있는 값이 어떤 타입인지 모르거나 만약 찾기도 쉽지 않을 때는 어떻게 해야 될까요? 정말 갑갑하겠죠?

- 그럴 때는 범용 데이터 타입을 반환하는 메소드를 사용하면 됩니다. 범용 데이터 타입을 반환하는 메소드는 Any타입으로 반환되기 때문에 캐스팅을 하면 됩니다.

 

범용 데이터 타입을 반환하는 메소드

* 코드 설명

- 이렇게 ud.value(forkey:" ")를 통해 key에 해당하는 값을 읽어오고 Bool타입으로 캐스팅을 하여 사용해도 됩니다.

- 대신에 범용 데이터 타입을 사용하면 옵셔널 타입으로 반환하기 때문에 주의를 해야 합니다. 그 이유는 as?로 캐스팅을 해주었기 때문에 옵셔널로 반환이 됩니다.

 

 

자 이제 UserDefaults객체는 앱이 제거되지 않는 이상 앱이 꺼져도 값이 사라지지 않고 남아있는다고 했죠? 대신 앱을 제거하면 사라집니다...ㅎㅎ

 

우선 앱 종료되고 다 시켜도 값이 그대로 남아있는지, 값이 잘 이동하는지 보겠습니다.

 

결과를 보시면 앱이 종료되고 다시 켜져도 값이 그대로 남아있는 게 보이시죠? 이렇게 UserDefaults를 사용하면 데이터가 제거되지 않는 장점이 있습니다.

 

지금까지 화면 전환을 하면서 동기, 비동기 방식으로 값을 전달한 것에 대해 알아봤습니다 :) 간단하지만 엄청 중요한 내용이므로 꼼꼼하게 읽고 넘어가시길 바랍니다 ㅎㅎㅎ

반응형
Comments