개발공부 정리 노트
IUO(Implicitly Unwrapped Optionals) 본문
IUO는 타입(자료형)에 !을 붙이는 문법으로 자동으로 추출되는 옵셔널입니다.
IUO는 Implicitly Unwrapped Optionals라는 말 그대로 암시적으로(자동적으로) 추출되는 옵셔널입니다.
IUO는 몇 가지 문법적 특징을 가지고 있습니다.
- 값을 non-optional 타입에 저장하기 전까지는 옵셔널과 동일하다.
- 값을 non-optional 타입에 저장하면 자동으로 추출된다.
- 강제 추출과 동일하므로 크래시 발생 가능성이 있다.
- 값을 다른 곳에 저장하면 그냥 Optional값이 된다.
첫 번째 특징부터 보겠습니다.
IUO는 값을 다른 타입에 저장하기 전까지는 옵셔널과 동일한 특징을 가집니다.
let iuoStr: String! = "Swift" // Optional("Swift")
이렇게 값을 IUO 타입으로 상수에 저장할 때까지는 옵셔널과 동일한 특징을 가집니다.
이때 값은 래핑 되어 있는 상태이고 옵셔널과 동일한 특징을 가지기 때문에 옵셔널 바인딩, 강제 추출 등 옵셔널에서 사용할 수 있는 모든 것들을 사용할 수 있습니다.
하지만 옵셔널과 동일하게 사용한다면 IUO를 사용하는 의미가 없겠죠.
두 번째 특징에서 IUO만의 특징이 나타납니다.
IUO 타입의 값을 타입 어노테이션을 통해서 생성하는 상수나 변수에 저장하면 자동적으로 non-optional 타입으로 강제 언래핑됩니다.
let iuoStr: String! = "Swift" // Optional("Swift")
let str: String = iuoStr
앞서 보셨듯이 iuoStr 상수는 IUO타입이지만 옵셔널 값과 동일한 특징을 가집니다.
하지만 타입 어노테이션으로 str 상수를 String 타입으로 선언하고 iuoStr 상수를 저장하면 String! 타입이 자동으로 강제 언래핑되어 String으로 선언한 str 상수에 저장됩니다.
이해하기 쉽게 옵셔널 타입과 비교하는 예제를 만들어 보겠습니다.
let optionalStr: String? = "iOS"
let str: String = optionalStr // 컴파일 에러 발생
// 값을 언래핑해서 넣어줘야 한다.
let strO1: String = optionalStr ?? "default"
let strO2: String = optionalStr!
옵셔널 값을 넌옵셔널 타입의 값에 저장하려면 옵셔널 바인딩을 해서 저장을 하던지 강제 추출 연산자를 사용하여 값을 언래핑해서 저장하는 방식을 사용해야 합니다.
이 말은 곧 처음 선언한 값 그대로를 저장하는 것을 불가능하다는 말이죠.
하지만 IUO를 사용하면 값을 넌옵셔널 타입에 저장할 때 자동적으로 강제 언래핑해주기 때문에 따로 언래핑 해 줄 필요가 없습니다.
다음으로 세 번째 특징을 보겠습니다.
IUO는 강제 추출(Forced Unwrapping)과 동일하므로 크래시 발생 가능성이 있습니다.
var iuoStr: String! = "Swift" // Optional("Swift")
iuoStr = nil
let str: String = iuoStr // 크래시 발생
위의 예제에서처럼 넌옵셔널 타입의 값을 저장하려 할 때 값이 nil로 저장되어 있다면 크래시가 발생합니다.
마지막 특징을 보겠습니다.
IUO는 값을 다른 곳에 저장하면 그냥 Optional값이 됩니다.
let iuoStr: String = "Swift"
let typeInferenceStr = iuoStr // String?
위의 예제처럼 타입 추론을 이용해서 다른 상수에 값을 저장하면 IUO의 기능을 잃어버리고 옵셔널로 타입 추론되어 값이 들어갑니다.
IUO는 보기에는 옵셔널보다 유연하게 값을 저장할 수 있어서 좋아 보이지만
강제 언래핑과 동일한 방식이기 때문에 사용을 지양하는 것이 좋습니다.
그럼에도 IUO를 주로 사용하는 곳이 있는데 바로 Outlet 연결입니다.
Outlet 연결에서 IUO를 사용하는 이유는 오류를 빠르게 찾아내기 위해서입니다.
# IUO 요약
- IUO는 타입(자료형)에 !을 붙이는 문법이다.
- non-optional에 저장하면 자동으로 추출된다. (특정 조건에서 자동으로 추출)
- 강제 추출과 동일하므로 크래시 발생 가능성이 있다.
'iOS > Swift' 카테고리의 다른 글
[반복문] for-in문과 while문 (0) | 2021.05.30 |
---|---|
[조건문] if (0) | 2021.05.13 |