본문 바로가기
YAGOM CAREER STARTER

[TIL] 20221222: Optional

by Rhode 2022. 12. 22.


본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.

 


 

옵셔널 Optional

어제는 옵셔널을 추출하는 방법에 크게 네 가지가 있다고 했다. 강제 추출, 옵셔널 바인딩, 암시적 추출 옵셔널, 옵셔널 체이닝.
https://c-git-erg-sum.tistory.com/22

 

[TIL] 20201221: Naming, Optional, Split, Components

네이밍 Naming Avoid abbreviations: 축약어를 피하라! Abbreviations, especially non-standard ones, are effectively terms-of-art, because understanding depends on correctly translating them into their non-abbreviated forms. 축약어, 특히 비표

c-git-erg-sum.tistory.com

야곰 활동 학습을 하면서 하나를 더 알아냈다. 여기에 하나를 더하겠다. Nil 병합 연산자이다.

Nil 병합 연산자 Nil-Coalescing Operator

옵셔널 인스턴스가 nil일 경우, 연산자를 통해 default value를 설정해줄 수 있다. 옵셔널 뒤에 물음표(?) 두 개를 붙여 주고, 다른 옵셔널이나 default value를 적어준다. 다음과 같은 형태로 쓴다.

let 상수이름 = 옵셔널 ?? default value  //default value는 말 그대로 디폴트값이다.
let 상수이름 = 옵셔널 ?? 옵셔널 ?? default value

다음의 예시를 보자.

let items = [1: "하네스", 2: "패딩", 3: "리드줄", 4: ""]
let defaultItem = "똥봉투"
let defaultNumber = 1

let one = items[5] ?? defaultItem
print(one)  //똥봉투

let two = items[5] ?? items[6] ?? defaultItem
print(two)  //똥봉투

let three = items[1] ?? items[5] ?? defaultItem
print(three)  //하네스

let four = items[1]
print(four)  //Optional("하네스")

let five = items[5] ?? "휴지"
print(five)  //휴지

let six = items[5] ?? defaultNumber
print(six)

let seven = items[5] ?? 2
print(seven)

딕셔너리에서 키값(key)값을 통해 value를 꺼내오면 그 반환값은 기본적으로 옵셔널(Optional)이다. items[5]와 같은 것들은 nil이 될 수밖에 없기 때문이다. 이럴 때, let one = items[5] ?? defaultItem을 해주면, items[5]의 값은 nil이므로 defaultItem의 값을 one에 넣어준다. let two = ~의 예시처럼 옵셔널을 여러개 이어 써줘도 결과는 같다. 그런데, let three = ~ 의 예시를 보자. items[1]에 "하네스"라는 값이 있다. 그래서 seven에는 items[1]의 value인 "하네스"가 옵셔널에서 추출된 채 넣어지는 것이다. four에는 nil 병합 연산자를 사용해주지 않았기 때문에, Optional("하네스")가 출력된다. defaultItem이라는 상수를 써주지 않고, five에서처럼 "휴지"라고 직접적으로 default value를 넣어줄 수도 있다.

그런데, 조심해야할 점이 있다.

items[5]는 Optional<String>이다. 아마, 딕셔너리가 [Int: String]의 형태라서 그런 것 같다. 그래서 items[5]의 뒤에 ??를 붙이고 defaultNumber를 넣으려고 하면 'Cannot convert value of type 'Int' to expected argument type 'String''이라고 하는 것 같다. 마찬가지로 seven처럼 defaultNumber대신 숫자 2를 직접 입력해줘도 결과는 같다.