티스토리 뷰

Swift

옵셔널(Optiona) 정복하기 - 5장

swallow.iOS 2022. 5. 12. 17:08

안녕하세요! Swallow입니다!

이번 포스팅은 Optioanl Unwrapped 방법 중

⭐️ IUO(Implicitly Unwrapped Optionals) 암시적 추출 ⭐️

관한 글입니다!

항상 어떠한 조언, 충고 환영입니다!

시작하기에 앞서 이 글은

앨런 Swift 문법 마스터 스쿨 강의와 야곰님의 스위프트 프로그래밍 책

공부하고 참고하여 작성하였습니다!

그럼 시작하겠습니다!

 

 

IUO란?

쉽게 말씀을 드리면

(특정 상황에서) 추출될 준비가 되어있는 타입입니다!

특정 상황? 그게 뭐지..?

라고 생각하실 거예요!

하나하나 설명드리겠습니다!

 

위의 내용을 설명드리기 전에

암시적 추출하는 방법부터 알아볼까요?

옵셔널을 선언할 때처럼 타입 뒤에!(느낌표)를 붙여주면 됩니다!

요렇게 말이죠!

var name: String! = "swallow"

 

오호...

옵셔널 선언 때와 기호 하나만 바뀌었네요?

 

그럼 과연 IUO는 무슨 타입일까요?

그것은!

IUO도 옵셔널 타입입니다!

즉, nil을 할당할 수 있다는 얘기겠죠?

 

기본적인 개념에서 대해서는 여기까지 말씀드리고

위에서 말씀드리려 했던

(특정 상황에서) 추출될 준비가 되어있는 타입의 의미를 알아볼까요?

 

특정 상황은 무엇이냐 하면은

옵셔널 타입이 아닌 변수로 할당이 될 때입니다!

즉, Non-Optional Type의 변수에 할당이 될 때라는 말이죠!

 

그럼 그 뒤에 연결해서 말한

추출될 준비가 되어있는 타입이란 말은 무슨 의미일까요?

특정 상황을 마주하면, 자동으로 언래핑 된다는 의미입니다!

 

아직 조금 느낌이 덜 오시죠?

바로 예시 한번 보실게요!

var name: String! = "swallow"
print(name) // Optional("swallow")

var name2: String = name // name2변수에 위에서 선언한 name을 할당
print(name2) // swallow

위에서 말한

(특정 상황에서) 추출될 준비가 되어있는 타입을

예시를 보면서 하나하나 설명드려볼게요!

 

첫 번째로

특정 상황

위에서 말씀드렸다시피

옵셔널 타입이 아닌 변수로 할당이 될 때

예시에서는 String타입인 name2 변수에 IUO로 선언한 name변수가 할당이 될 때입니다

 

두 번째로

추출될 준비가 되어있는 타입

name변수를 String!으로 선언을 했기에

위에서 말한 특정 상황이 오면

자동으로 추출이 됩니다!

 

즉, 쉽게 정리를 해드리면

String타입인 name2 변수에 IUO 선언을 한 name변수가 할당이 될 때 - 특정 상황

자동으로 옵셔널 값을 벗겨서 할당을 합니다 - 추출될 준비가 되어 있다

 

크게 어려운 문법은 아니랍니다! 😁

 

그리고 IUO를 다룰 때 알아두셔야 할 부분이 있습니다!

첫 번째로

위에서 말씀을 드렸는데

IUO도 결국 옵셔널 타입이라고 말씀을 드렸습니다

그래서 nil을 할당할 수 있죠!

var age: Int! = 24  // Optional타입 이기에, 값을 할당하지 않으면 nil 자동 초기화
print(age)  // Optional(24)

특정 상황이 없이

그냥 접근을 한다면 IUO도 옵셔널 타입이기에

위의 예시처럼 출력 시

Optional(24)가 출력이 됩니다!

 

두 번째로

IUO타입이 담겨 있는 변수를 다른 변수에 할당할 때,

타입 어노테이션을 사용하지 않는다면

즉, 자동으로 해당 타입을 추론하도록 만든다면

자동으로 추출이 되질 않습니다

말이 좀 어렵죠..?ㅎ

예시로 설명드릴게요!

var apple: String! = "애플"

var swift = apple // swift의 타입을 명시를 해주지 않음
print(swift) // Optiona("애플")

위의 예시를 분석해 보겠습니다!

apple변수에 String! 타입을 선언을 했고, "애플"이라는 문자열을 할당을 했어요

swift변수를 선언하면서, 타입을 명시해 주지 않고 apple변수를 할당을 했습니다

여기서 swift변수의 타입을 명시해주지 않았으니 컴파일러가 자동으로 추론을 하겠죠?

이럴 때는 swift변수의 타입은

swift변수의 타입

String? 타입으로 선언이 되어있습니다!

그래서 print(swift)를 하면

Optional("애플")이 출력이 됩니다!

 

그리고, IUO도 옵셔널 타입이기 때문에

옵셔널 바인딩, 강제 추출

전부 다 사용이 가능합니다

 

그런데 IUO를 왜, 언제 사용을 할까요?

실제 앱 구현 시에 많이 사용을 합니다!

 

IBOutlet 연결할 때 위의 예시들과 같은 타입으로 자동으로 선언이 됩니다!

앱 구현시 IBOutlet 예시

그래서 옵셔널 체이닝을 사용하지 않아도 됩니다!

옵셔널 체이닝에 관해서는 나중에 다루겠습니다!

 

그래서 실제 앱 구현 시 IUO는 개발자의 실수할 가능성을 낮춰주는 역할을 합니다!

정말 좋은 녀석이에요!

 

그리고 IUO의 장점이 있습니다!

생성시 저장 프로퍼티에 실제 값이 할당되지 않아도,

초기화 오류가 발생하지 않아요!

쉽게 말씀드리면

지연 저장과 유사하다고 생각하시면 됩니다!

그래서 스토리보드와 연결 시 연결된 객체들이

나중에 생성된 후에 연결(할당)되는 것도 가능하답니다!

이 부분은 앱을 직접 만들다 보면 쉽게 이해가 가실 겁니다!

 

이번 포스팅에서는 IUO에 대해서 알아보았는데요!

그렇게 어렵지는 않은 내용이라고 생각합니다!

옵셔널에 관해서는 이번 포스팅이 마지막이고,

옵셔널 체이닝에 관해서는 나중에 깊이 있게 다루겠습니다!

 

감사합니다!

 

피드백 언제나 환영입니다!

댓글