[iOS_Swift] 옵셔널(Optional) 제대로 이해하기

2022. 1. 5. 17:43Programming/iOS_Swift

옵셔널(Optional)이란?

  공식 문서에 의하면 '옵셔널'이란 값이 없을 수도 있는 상황(nil)에서 사용되어지는 표현으로, Swift의 특징 중 하나인 안전성을 문법을 적용시킴으로써 보장해주는 기능이다!

  값이 없을 수도 있는 상황이라는게 조금 모호할 수도 있는데, 공식문서에서는 이러한 점을 보완하기 위해 다음과 같이 설명하고 있다.

 

  요약하면, PossibleNumber라고 하는 String타입인 상수가 있고 ConvertedNumber라고 하는 상수가 있다. 컨버티드넘버는 파서블넘버의 값을 Int타입으로 초기화한 값을 갖는다. 그런데 초기화하는 과정에서 실패가 일어날 수도 있다. 위의 예시는 파서블넘버의 값이 숫자로만 이뤄진 String타입이기때문에 초기화가 성공하지만 만약 파서블넘버가 "Hello, world"같은 문자열로 이뤄진 String타입이라면, Int타입으로 초기화는 이뤄지지 않고 nil을 반환할 것이다. 이렇게 실패할 수도 있는 상황이 존재할 수 있기에 옵셔널이라고 하는 개념이 사용된다.

  다시 정리하면, 위의 코드의 경우 파서블넘버가 숫자로만 이뤄진 String타입임에도 만약에 문자가 있으면 컴파일 에러라고 하는 큰 일이 생길 수도 있으니까, 초기화가 실패하면 nil을 반환할 수 있게 안전하게 Int 타입이 아닌 Int? 타입을 반환하는 것이다.

 

옵셔널 특징

  1. 옵셔널 선언은 2가지 방법으로 표현해줄 수 있다. 보통 거의 99% 첫번째 방법으로만 사용한다.

  2. 옵셔널 타입은 nil값을 가질 수 있다. 옵셔널이 아닌 타입에 nil값을 주면 컴파일 에러가 일어난다.

  3. 옵셔널은 열거형이다.

  옵셔널의 definition을 보면, 옵셔널은 두 가지 케이스를 가진 열거형이라고 설명하고 있다. 추가적으로 제네릭을 이용해서 Wrapped라는 타입 매개변수를 가지고 있음을 알 수 있다! 코드에서 일반적으로 값이 없을 때 .none이라고 쓰는 대신에 nil을 더 많이 사용한다.

Optional.none
Optional.some()

왜 알아야 할까?

  옵셔널을 모르면 스위프트 프로그래밍이 매우매우매우 힘들어진다.(영문도 모른채 코드에 흩뿌려져있는 빨간색 ? 밭을 확인할 수 있다) 앞서 얘기했듯이, 스위프트는 안전성을 중요시하기에 런타임에러를 일으킬 수도 있는 타입들을 옵셔널로 반환해버려서 개발자가 컴파일 단계에서 옵셔널타입들을 미리 처리(guard문, guard let문, 옵셔널 바인딩, 옵셔널 체이닝)하게끔 만들어준다.

  원활한 스위프트 프로그래밍을 위해 반드시 숙지해두자!

 

** 왜 알아야 할까? 부분은 현재까지 제가 느낀 사견이기 때문에, 틀릴 수도 있습니다. 내용이 잘못됐다면 언제든 지적해주세요!