[swift] 옵셔널(Optionals)
옵셔널이란?
- 값이 있을 수도, 없을 수도 있는 변수
let num: Int = 0 // Non-optional Type
let optionalNum: Int? = 0 // Optional Type
타입 이름 뒤에 " ? "를 붙여서 사용하게 되면 Optional Type이 된다.
let num: Int // ERROR
let num: Int = nil // ERROR
let optionalNum: Int? = nil // nil
let optionalNum: Int? // nil
Non-Optional Type은 초기화를 하지 않거나 nil 값이 들어왔을 때 Error가 발생한다.
왜냐하면 Non-Optional Type은 선언한 타입 외의 값이 들어올 수가 없기 때문이다.
Opional Type은 nil 값이 들어와도 오류가 발생하지 않는다.
왜냐하면 Opional Type은 값을 가지지 않아도 되기 때문이다.
Unwrapping (언래핑)
var num: Int? = 123
var nonNum: Int = 123
print(nonNum) // 123
print(num) // "Optional(123)\n"
Opional Type의 값은 Non-Optional Type의 값과 다르다.
기존의 값이 가공되어 있어서 언래핑을 통해 값을 원래 값으로 추출해야 사용이 가능하다.
1. Forced Unwrapping (강제 추출)
- 언래핑을 하는 방법 중 하나인 강제 추출하는 방법
print(nonNum) // 123 -> Optional Type
print(num!) // 123 -> Non-Optional Type
옵셔널 변수 뒤에 " ! "를 붙여서 강제 추출하여 사용합니다.
언래핑을 하기전의 자료형은 Opional Type이고, 언래핑을 하고 난 후의 자료형은 Non-Optional Type입니다.
※ 주의사항
var num: Int? = nil
print(num!) // ERROR
값이 없는 상태에서 강제 추출을 하면 심각한 에러가 발생합니다.
만약에 앱에서 이러한 상황이 일어나면 App Crash 가 발생합니다.
var num: Int? = nil
if(num != nil) {
print(num!)
}
그래서 IF문을 통해서 이러한 상황을 미리 방지하는 코드를 작성한다.
가능하면 프로그램에서는 강제 추출은 많이 사용하지 않는 걸 권장한다. 왜냐하면 Crash 가 발생하기 때문입니다.
정리
1. 옵셔널에 저장되어 있는 값을 사용하려면 값을 언래핑 해야 한다.
2. nil이 저장되어 있는 값을 강제 추출하면 Crash가 발생한다.
3. Optional Type을 언래핑 하면 Non-Optional Type을 리턴한다.