Swift는 안전한 코딩을 할 수 있게 해주는 언어입니다. 이때 이 안전성의 기본 바탕에 있는 중요한 요소 중 하나가 Optional입니다.
'?' 키워드를 사용하는 Optional은 변수의 값이 nil일 수 있다는 것을 표현합니다.
이는 변수의 타입 뒤에 ?를 붙여 사용되는데, Optional은 말 그대로 선택적(옵션)이고 기본값은 non-Optional로 사용됩니다.
Optional은 Type casting, nil value 체크 등에 있어서 중요한 역할을 합니다.
Swift에서는 기본적으로 변수 선언시 nil 값이 들어가는 것을 허용하지 않고 컴파일 에러를 내기 때문에 이와 같은 상황이 발생하지 않도록 Optional 처리를 해줍니다.
따라서, Swift는 기본적으로 non-optional을 지원하면서 갖는 큰 장점이 있는데, nil에 대한 컴파일 에러를 통해 개발자는 nil에 대해 명확한 예외처리가 강제되며, 런타임에 nil로 인한 문제를 컴파일 단계에서 예방할 수 있습니다. 그래서 Swift가 잠재적 오류에 대해 안전하다는 말도 합니다.
만약 A optional과 B non-optional가 있다고 했을 경우 A와 B가 연산을 시도하면 컴파일 에러가 발생합니다. 이는 A가 optional로 nil값을 가질 가능성이 존재하기에 컴파일 단계에서 에러를 발생시킵니다. 따라서 optional변수를 이용해서 작업시 Optional을 해체하는 unwrapping 또는 binding 과정이 추가적으로 필요합니다.
옵셔널 해제란, Optional변수에서 Optional 껍데기를 벗겨내는 작업입니다. 무조건 변수가 있는 상황이 보장된 경우 !를 쓰면 optional 껍데기를 벗어낼 수 있습니다. 위의 예시를 이어쓰자면, if로 A 변수값이 nil이 아닌지 판별 후 unwrapping인 ! 키워드를 통해 강제로 값을 꺼내옵니다.
var A:Int? = 20
var B:Int = 100
if A {
let sum = A! + B!
}
옵셔널 바인딩은, Optional 타입으로 선언된 변수에 값이 있는지 없는지를 확인 할 수 있도록 해주는 기능입니다. 옵셔널 해제와 달리 Optional 값을 새로운 상수로 받고, 그 이후로 non-optional값을 사용합니다. 이때 새로운 상수 C는 이미 non-optional로 연산에 사용할 때 ! 키워드 사용할 필요가 없이 Optional 타입의 변수 값을 출력할 수 있기에 좀 더 안전한 형태로 값을 얻을 수 있습니다.
var A:Int? = 20
var B:Int = 100
if let C = A {
let sum = C + B
}
여러 객체를 혼합해서 사용하다보면 Optional끼리 연산이 필요한 경우가 발생하는데, 이때 객체마다 옵셔널 바인딩을 사용하게 되면 if문이 복잡해집니다.
옵셔널 체이닝은, 좀 더 간단하게 Optional 예외처리 할 수 있습니다.
Objective-C에서 아직 nil타입이 존재하며 하나의 프로젝트에서 obj-c와 swift를 혼용해서 사용할 수 있습니다. 따라서 obj-c와 상호운용성을 위해 사용합니다.