iOS

nil 병합 연산자(nil coalescing operator)란?

GEEEEEEEE

먼저, Optional에 대해서 간단하게 알아보자.

 

 

 

 

Optional 공식 문서의 정의

 

wrapping 된 값이 있거나 값이 없음을 나타내는 type이다. 

 

 

 

 

Optioanl은 값을 가질수도 값을 가지지 않을수도 있다.

 

예시를 보면, 각각의 타입이 둘 다 Optioanl Int 타입을 가지지만,

 

하나는 Int 타입인 값을 가지므로 10을 출력할 수 있지만, 

 

다른 하나는 값이 없는 nil이므로 nil을 출력하게 된다. 

 

 

 

 

출력된 결과물

 

출력된 10은 Optional Int 타입이므로 Optional(10)의 형태로 출력되게 되고, 

 

unwrap을 해주기 위해선 여러가지 방법이 있다고 공식 문서에 적혀있다. 

 

여러가지 방법이 적혀있었고

 

nil coalescing operator도 찾아볼 수 있었다. 

 

 

 

 

nil coalescing operator

 

 

 

공식 문서를 먼저 보자. 

 

 

nil coalescing operator 공식문서의 정의

 

nil coalescing operator을 수행하여 인스턴스의

 

 

     Optional의 wrapping된 값 또는 기본값을 반환한다.    

 

 

 

 

 

 

nil coalescing operator 공식문서의 설명

 

 

nil-coalescing 작업은 값이 있을 경우에 왼쪽을 unwrap 하거나,

 

오른쪽을 기본값으로 반환한다. 

 

이 작업의 결과는 왼쪽편에 있는 wrapped type의

 

non - optional(옵셔널이 아닌)이 될 것이다.

 

이 연산자는 short-circuit evaluation을 사용한다.

 

optioanl이 먼저 확인이 되고

 

optioanl이 nil인 경우에만 기본값을 평가하게 된다.

 

 

 

 

 

 

예시를 만들어 보았다.

 

 

let goodNumber: Int = Int("100") ?? 50

 

 

 

goodNumber는 Optional 값이다. 

 

변환하려고 하는 String 값이 숫자로만 이루어져 있어야 변환이 일어나기 때문이다. 

 

왼쪽에 있는 Int("100")는 값이 있는지 확인했을 때,

 

nil이 아니고 값이 존재하므로 unwrap을 하게 되고,

 

연산자 오른쪽에 있는 기본값 50은 Optional 이었던 Int("100")가

 

값이 존재하므로 확인하는 과정을 거치지 않게 된다.

 

따라서, goodNumber의 값은 100이 된다.

 

 

 

 

 

 

let goodNumber = Int("good") ?? 50



 

 

 

변환하려고 하는 String 값이 숫자로만 이루어져 있지 않다.

 

그러면 Int("good")은 변환에 실패하고 nil임이 확인됨에 따라 연산자 오른편에 있는

 

기본값인 50을 대체값으로 지정해주게 된다.

 

위에서 제대로 알지 못했던 nil coalescing의 뜻은 nil을 합친다.

 

즉, 결과물이 nil로 확인됨에 따라, 

 

기본값으로 nil을 병합하여 반환해준다는 작업으로 해석할 수 있겠다. 

 

 

 

 

 

 

forced unwrapping도 Optional을 해제할 수 있는 방법 중의 하나이다.

 

import Foundation

let number: Int = Int("1000")!

print(number) // 1000

 

 

 

String 값인 1000을 Int로 100% 변환할 수 있다는 확신이 있기 때문에

 

forced unwrapping을 사용함으로써

 

오류가 발생하지 않고

 

Optional 값을 열 수 있었지만 위와 같은 경우와 달리,

 

값이 nil일 경우, 오류가 발생하게 된다.

 

따라서, Optional을 해제할 때에는

 

무조건! 안전하게 unwrap 하는 방법을 지향하도록 하자.