옵셔널 언래핑(optional unwrapping)이란?

devapploper·2021년 1월 30일
0

스위프트 zero to hero

목록 보기
2/10

고양이가 있다고 가정해보자. 고양이의 이름과 나이를 정보로 담았다. 고양이는 있을 수도, 없을 수도 있기 때문에 각각의 값을 옵셔널로 나타냈다.

var catName: String? = "미미"
var catAge: Int? = 3
print(catName) // Optional("미미")

catName 변수를 콘솔에 출력하면, 값이 Optional 하고 괄호에 감싸져 있는 것을 볼 수 있다.

옵셔널 변수에 담긴 값은 옵셔널에 감싸져 있다.

옵셔널에 감싸져있다는 말이 어떤 말인지 잠깐 알아보자.

옵셔널 내부적으로는 제네릭한 Enum으로 구현이 되어있다.

옵셔널 타입은 Optional<Wrapped> 로도 표현이 가능하다. 여기서 Wrapped는 옵셔널로 지정하고자 하는 타입이다. String?Optional<String> 와 동일하고, Int?Optional<Int> 와 동일하다. 간편하게 옵셔널 타입을 나타낼 수 있도록 물음표를 사용하는 것이 보편적이다.

옵셔널 내부적으로 Enum으로 구현되어있고, 이 Enum에는 두가지 case가 있다. 하나는 associated value로 값이 담긴 .some(Wrapped) 이고, 다른 하나는 nil과 동일한 .none이다.

값이 옵셔널에 감싸져 있다는 말은 즉 Enum 옵셔널 타입의 case에 associated value로 값이 담겨있다는 것이다.

여기서 associated value 나 enum 혹은 제네릭이 무슨 말인지 몰라도 상관없다. 다만 옵셔널 타입의 값은 어떤 보호막에 감싸져 있다고 보면 된다.

다시 예시로 돌아와서, 1년이 지났다고 가정을 해보자. 이때 고양이의 나이는 1살이 늘게 될 것이다. 기존의 고양이의 나이에 1을 더한 값으로 갱신해보겠다.

var catName: String? = "영희"
var catAge: Int? = 3
catAge = catAge + 1 

당연히 4 라는 값이 catAge 에 할당될 것이라고 생각할 수 있지만, 옵셔널 값은 사용하기전에 전처리 과정이 필요하다.

위를 실행해보면 error: value of optional type 'Int?' must be unwrapped to a value of type 'Int' 라는 에러가 출력되면서 실행이 정상적으로 되지 않는 것을 볼 수 있다.

옵셔널은 앞서 말했듯이 값이 옵셔널이라는 타입의 보호막에 감싸져 있다. 그렇기 때문에 값을 사용하기 전에 보호막으로부터 값을 꺼내주어야한다. 값에 감싸져 있는 옵셔널을 "벗겨낸다고" 하여 옵셔널 언래핑 (optional unwrapping)이라고 한다.

다음 포스트부터는 스위프트의 옵셔널에 관한 7가지 개념을 다뤄볼 것이다.

  1. force unwrapping
  2. optional binding - if
  3. optional binding - guard
  4. nil coalescing
  5. optional chaining
  6. implicitly unwrapped optional
  7. optional pattern
profile
app 을 dev 하는 developer. devapploper 입니다

0개의 댓글