[Swift] Optional Unwrapping

어흥·2024년 5월 5일

Swift

목록 보기
5/28

안녕하세요! 오늘은 Optional 편에 이어 Optional type을 이용하려면 꼭 필요한 과정인 Unwrapping에 대해서 알아보려고 합니다!

Optional 편에서 배웠다시피 Optional type을 사용하여 계산할 수 없습니다. 따라서 옵셔널(Optional) 타입 추출을 해야합니다.

1. Forced Unwrapping(강제 추출)

강제 추출 방식은 강제 추출연산자인 '!'을 옵셔널 타입 표현식 뒤에 붙여서 강제로 옵셔널 값을 추출하는 방식입니다.

var champion: String? = "tigers"
print(chamption) // Optional("tigers")

print(champion!) // tigers

위와 같이 Optional 타입 표현식 뒤에 느낌표를 붙이면 값을 추출할 수 있습니다.
하지만 강제 추출 방식은 옵셔널 타입 강제로 추출하는 방식으로 값이 없으면 에러가 발생합니다.

var num: Int? 
print(num!) // error

optional 타입 표현식에 대해서 값이 들어있는지 확인하는 절차를 거치지 않기 때문에 값이 있다는 것이 확실할 때 사용해야 하며 자주 사용하는 것을 지양해야 합니다.

2. if 문을 이용한 Unwrapping

위 방식은 optional 타입 표현식이 nil인지 확인하는 절차를 추가하여 안정성을 높인 unwrapping 방식입니다.

if chamption != nil {
    print(str!)
}

champion 변수가 nil이 아닐 때, forced unwrapping을 진행하여 값을 추출합니다.

3. Optional Binding(옵셔널 바인딩) ⭐️⭐️⭐️

3번째 방식은 Optional Binding 방식입니다. (binding은 상수나 변수에 할당)

기존의 if문과 '!'을 활용한 Unwrapping 방식에 비교하면 Binding 방식이 좋은 점은 Unwrapping되어 새로운 값에 할당이 되기 때문에 조건문 안쪽에서 ?. , ?? , ! 같은 기능을 사용하지 않아도 됩니다. 보다 코드가 깔끔해진다.

Optional Binding 방식은 2가지가 있습니다. if let 방식과 guard let 방식입니다. 중요한 부분이니 유심하게 보시면 좋습니다!

1) if let 바인딩

if let 바인딩 방식은 상수나 변수에 옵셔널 타입 변수를 바인딩하는 과정을 거칩니다. 상수나 변수에 옵셔널 타입 변수가 담긴다면 nil값이 아니므로 해당 값을 담은 상수 값을 이용할 수 있습니다.

  • nil 값일 시, 상수에 안담김
  • nil 값이 아닐 시, 상수에 담김 -> if 문 중괄호 코드 실행 가능
var optionalName: String? = "홍길동"

if let name = optionalName {
    print(name) // 홍길동
}

2) guard let 바인딩 ⭐️⭐️⭐️

guard let 바인딩 방식 if let 방식과 동일하게 바인딩 과정을 거칩니다.
차이점이 있습니다.

guard let optionalName = name else {return}

guard let 방식은 optional 타입 값이 nil일 때 else 뒤에 중괄호 문이 실행됩니다.

따라서 guard let을 통해 선언된 상수(or변수)를 아래 문장에서 사용 가능합니다. (동일한 스코프 취급) 이렇게 동일한 스코프로 취급되기 때문에 함수 안에서 많이 사용됩니다.

func doSomething(name: String?) {
    guard let n = name else { return }
    print(n)
}

doSomething(name: "hello")

4. Nil-Coalescing (닐 코얼레싱)

마지막 언래핑 방식으로 닐 코얼레싱 방식이 있습니다. (coalesce: (더 큰 덩어리로) 합치다)

닐 코얼레싱은 삼항연산자를 이용한 표현식을 간편하게 표현한 방식입니다.
Nil-Coalescing 연산자인 '??'을 뒤에 붙이고 optional type 표현식이 nil일 때 이용할 표현식을 뒤에 작성해야 합니다.

  • nil 일 때, "nothing"
  • nil이 아닐 때, "tigers"
// 1번째 방식
var championName: String? = "tigers"
print(championName != nil ? championName! : "tigers")

// 2번째 방식
print(championName ?? "nothing")

위 코드를 보면 1번째 방식보다 2번째 방식이 훨씬 간편한 것을 확인할 수 있습니다.
이 방식은 default 값이 정해져 있을 때 사용하면 좋습니다.

이상으로 optional unwrapping에 대해서 알아보았습니다.
optional 타입은 보다 안전한 실행 환경을 위해 있는 타입입니다. optional 타입을 이용하기 위해 4가지 unwrapping 방식이 있습니다. 이 포스팅을 읽으시고 각 unwrapping 방식에 대해서 잘 이해해주시면 좋을 거 같네요 :)

참고

Swift: Optional 잘 활용하기 (Optional Chaining과 Binding)

0개의 댓글