옵셔널 타입은 nil 값과 연관되어 있습니다.
nil값은 말 그대로 "존재하지 않음"을 의미하며, 이는 0과는 다릅니다. 0은 0이라는 숫자가 "있는" 것이지만 nil은 존재하지 않는 값이기 때문에 0인지 아닌지 조차 알수없다라는 의미가 됩니다.
예를 들어 집에 냉장고가 있다면 안에 물병이 있는지 없는지, 그리고 몇병인지 알 수 있습니다. 냉장고를 찾아봐서 물병이 없으면 물병의 수량은 0이 됩니다. 하지만 냉장고가 있는지 없는지조차 모른다면, 안에 물병이 있는지 없는지 어떻게 알 수 있습니까? 물병은 여러개일수도 있고, 아예없을 수도 있고 냉장고 자체가 없을 수도 있으니 값은 "알수없음" 또는 "존재하지 않음"인 nil이 됩니다.
이 nil값이 들어갈 것을 상정하고 코딩하지 않으면 런타임 에러가 납니다. 어느 변수에 할당된 값을 가져오라고 했더니 그 값이 nil이고, 그 nil값을 어떻게 처리할 것인지에 대해 정의가 되어 있지 않다면 런타임 에러가 납니다.
예전 프로그래밍 언어에서는 "당연히 프로그래머가 nil값이 들어가도 처리가 될수 있게 짜놨겠지" 라고 생각하며 만들었기에 nil값에 대해 프로그래밍 언어 자체에서 보조해주는 도구가 없었습니다.
스위프트에서는 옵셔널 타입이라고 해서, 그 변수에 nil값이 확실히 안들어갈 경우에는 !를 붙이고, 변수에 nil값이 들어가는 경우에는(또는 들어갈지 아닐지 확신할 수 없을 경우에) ? 마크를 붙여 작성하지 않으면 아예 컴파일이 되지 않습니다. (물론 생각없이 nil이 들어갈수도 있는 변수에 !를 붙였다가는 얄짤없이 런타임 에러)
옵셔널 체이닝이나 옵셔널 언래핑같은건 그 nil값의 처리 방법과 관련된 것입니다.
이전 게시물에서 스위프트에 옵셔널 타입에 대해 물어보신 분이 계셔서 조금 써 봅니다.
아니 시발 옵셔널 그거 뭐도 없는데 다들 며칠동안 집착이셔 - return 0;