값이 있을 수도 있고, 없을 수도 있는 타입을 옵셔널 타입이라고 합니다.
표기는 ?로 작성합니다.
예를 들어 var number: Int 라고 선언하고 초기화는 하지 않았다고 가정해봅시다.
이 number를 print하면 컴파일러에서 에러를 발생시킵니다. 당연합니다.
메모리에 공간은 만들었지만 그 내부에 값을 할당하지 않았기 때문입니다.
그렇다면 var number: Int? 라고 선언하고 초기화는 하지 않았다고 가정해봅시다.
이 number를 print하면 nil이라는 결과값이 나옵니다. nil이 과연 무엇일까요?
nil은 값이 없음을 나타내는 값입니다.
그러니까 값이 실제로 없는 것이 아니고 '값이 없음'을 나타내는 값이라는 뜻입니다.
그렇다면 옵셔널을 어떻게 벗길 수 있을까요? 4가지 방법이 존재합니다.
1) 강제 언래핑
var three: Int? = 3
print(three!) // Optional(3)이 아닌 3이 나옵니다.
2) if문을 사용해 언래핑 (강제 언래핑과 같이 사용해야 함)
if three != nil {
print(three!)
}
3) if let 바인딩, guard let 바인딩
if let successThree = three {
print(successThree)
}
4) 닐 코얼레싱
var name = nil ?? "길동"
print(name) // 길동
A ?? B 구문. 만일 A값이 nil이라면 , default 값, 즉 B를 nil 대신 할당하도록 하는 구문입니다.
즉, 옵셔널은 에러가 발생하는 것을 방지하기 위한 최고의 안전장치인 겁니다. 메모리에 값이 없을 경우 nil로 처리하고,
값이 있을 경우에는 Optional(값)으로 나오기 때문에 값이 있는 것을 확인하면 옵셔널을 벗겨서 사용하면 되기 때문입니다.
Optional은 내부적으로 enum 타입이며 some과 none 두 case가 존재합니다.