본문 바로가기
iOS/Swift

[Swift] 옵셔널 언래핑 (Optional Unwrapping)

by 혜모리 2022. 12. 21.
728x90

저번 포스팅에서 옵셔널이라는게 무엇인지, 왜 필요한지 알아보았습니다.

옵셔널 (Optional) 알아보기

옵셔널은 Optional(값)으로 보호되고 있기 때문에 그대로 사용할 수가 없습니다.

옵셔널을 벗겨낸 뒤, 그 결과 남은 값을 사용할 수 있습니다.

옵셔널을 벗겨낼 수 있는 Optional Unwrapping 중 주로 사용하는 몇가지 방법에 대해 소개해 보겠습니다.


1. 강제 추출 (forced unwrapping)

느낌표(!)를 사용하여 강제로 벗겨내는 방법입니다.

이전 포스팅에도 소개했지만 컴파일, 런타임 오류가 발생하기 딱 좋은 방법이므로 정말 확신할 때가 아니고서는 사용을 지양합시다.

타입에 !를 붙여주면 암시적 추출 옵셔널 (Implicitly Unwrapped Optional)로 사용할 수 있습니다.

 

var someNumber: Int!
someNumber = 28

print(someNumber) // Optional(28)
print(someNumber!) // 28

 

2. 옵셔널 바인딩 (Optional Binding)

안전하게 옵셔널을 벗겨내는 방법을 옵셔널 바인딩 (Optional Binding)이라고 부릅니다.

그 중 if let, guard let을 많이 사용합니다.

 

- if let

옵셔널 값을 받아낼 상수를 만들어 nil이 아닌 경우 중괄호 내의 코드를 실행해 줍니다.

그러나 여기서 만든 상수는 해당 if문 내에서만 사용할 수 있습니다.

 

var someNumber: Int?
someNumber = 13

if let age = someNumber {
    print(age)
} else {
    print("입력한 나이가 없습니다.")
} // 13 출력. someNumber가 nil이라면 "입력한 나이가 없습니다."을 출력

 

- guard let

옵셔널 값을 받아낼 상수를 만들어 nil이 아닌 경우 그 다음의 코드를 실행해 줍니다.

nil인 경우 else를 작성하는데, 이곳에는 반드시 제어 전달문(Control Transfer Statement)을 사용해야 합니다.

 

var someNumber: Int?
someNumber = 13

func inputAge() {
    guard let age = someNumber else {
        return print("입력한 나이가 없습니다.")
    }
    print(age)
}

inputAge() // 13 출력. someNumber가 nil이라면 "입력한 나이가 없습니다."을 출력

 

- 제어 전달문 (Control Transfer Statement)

  1. break : 문장이 중첩되어 있을 때 가장 인접한 문장을 중지합니다.
  2. continue : 현재 실행중인 반복을 중지하고, 다음 반복을 실행합니다.
  3. return : func에서 다음 값을 반환해준다는 뜻입니다.
  4. fallthrough : switch에서 바로 다음에 있는 case도 같이 내려준다는 뜻입니다.
  5. throw : 오류 처리에서 다음 오류를 던져준다는 뜻입니다.
  6. (break or continue) Label이름 : 가장 인접한 문장이 아닌 원하는 문장을 제어하고 싶을 때 사용합니다.
Label: statement
// 문장 앞에 원하는 Label을 붙인다.

break Label이름
continue Label이름
// break, continue 뒤에 설정해놓은 Label을 적으면 된다.

 

4. 옵셔널 체이닝

옵셔널 체이닝은 연쇄적으로 프로퍼티, 메소드, 서브스크립트의 값이 nil인지 확인하는 과정입니다.

사용 시 ?를 붙여서 표현합니다.

하나라도 nil이 발견되면 전체 결과를 nil로 도출해줍니다.

 

person.contacts?.residence?.address
// contacts 또는 residence 값이 하나라도 nil이면 nil이고 둘 다 값이 있다면 address를 도출

 

5. nil 병합 연산자 (nil coalescing)

nil 병합 연산자는 ??로 표현합니다.

?? 앞의 값이 nil 이라면, ?? 뒤의 값을 반환해 달라는 뜻을 가지고 있습니다.

 

var someNumber: Int?
someNumber = 13

print(someNumber ?? "입력한 나이가 없습니다.")
// 13 출력. someNumber가 nil이라면 "입력한 나이가 없습니다."을 출력

728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] 옵셔널(Optional)  (0) 2022.11.16
[Swift] 조건문(if-else, switch)  (0) 2022.11.15
[Swift] 열거형(enum)  (0) 2022.11.13
[Swift] 논리 연산자  (2) 2022.11.09
[Swift] 반복문(while, repeat-while)  (0) 2022.11.09

댓글