💡 옵셔널, 옵셔널 추출, 옵셔널 바인딩, 옵셔널 체이닝
타입의 일종. 값이 있을 수도 있고 없을 수도 있는, 변수 혹은 상수가 nil일 수도 있다는 것을 나타낸다.
?
!
nil : 특정 타입에 대한 값의 부재를 나타내는 키워드
var thisIsInt: Int
//컴파일 오류 : nil cannot be assigned to type 'Int'
thisIsInt = nil
nil은 Int 형 타입에 할당될 수 없다고 컴파일 오류가 남. Int형으로 선언한 변수는 무조건 ‘정수 타입’의 값이 할당되어야 한다.
Swift에서는 기본적으로 변수를 선언할 때 non-optional, 즉 어떠한 ‘값’을 변수에게 할당해야한다. 하지만 코딩을 하다보면 변수에 값이 들어가지 않을 수도 있고, 변수 안에 값이 확실히 있다는 것을 보장할 수 없으면 Optional을 사용해야함.
var thisIsIntOrNil : Int?
thisIsIntOrNil = nil
옵셔널 기호를 사용해 이 변수(thisIsIntOrNil)에는 값이 있을 수도, 없을 수도 있다는 것을 알려준 셈.
var a : Int? = 30
var b = a
//컴파일 오류 : value of optional type 'Int?' must be unwrapped to a value of type 'Int'
var b: Int = a
a의 뒤에 ?
가 붙었기 때문에 우리는 a에 정수 또는 nil이 할당될 수 있음을 알 수 있다.
이 때 b의 타입은 뭘까? 바로 옵셔널 타입임! 즉 Int? 이다. Int 타입이 아님.
옵셔널 변수의 값을 옵셔널이 아닌 값으로 추출하는 방법. 운 좋게 값이 있을 수도 있고, 아닐 수도 있다.
!
: 언래핑(upwrapping)
var a: Int? = 1206
//b는 정수형 타입 변수로, 정수값만 받을 수 있다.
var b: Int = a!
강제로 wrap을 부시고 값(정수 1206)을 꺼내와 b에 할당한 모습. Int형인 b에 성공적으로 할당되었다.
근데 만약 옵셔널 추출(unwrapping)을 사용해 강제로 꺼낸 것이 nil, 즉 값이 없다면?
var a: Int? = nil
var b: Int = a!
컴파일 오류는 발생하지 않는다. 허나, b의 값(nil)에 접근하려는 순간 런타임 에러가 발생한다.
!
도 옵셔널이기 때문에 ?
와 마찬가지로 초기화 시 값을 요구하지 않는다.
초기화 하지 않을 시 자동으로 nil이 할당됨.
!