Optional Unwrapping(옵셔널 해제)

Lily·2021년 9월 25일
0

안녕하세요! 오늘은 Optional Unrwapping, 옵셔널 객체를 해제하고 내부에 있는 값을 추출하는 방법에 대해 알아보도록 하겠습니다!😀


1. Forced Unwrapping (강제 해제)

옵셔널 타입값에 강제 해제 연산자(Forced-Unwrapping Operator) "!"를 붙이는 방법입니다.

var optInt = Int("123")

print(optInt!)

//실행 결과
123

주의할 점은 옵셔널의 값이 nil이 아닌 경우에만 사용해야 한다는 것입니다. 만약 nil일 경우에 강제 해제를 사용하면 오류가 발생하기 때문입니다. 강제 해제 연산자를 사용할 땐 먼저 옵셔널 값이 nil인지 아닌지 체크 후 사용해주세요!


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

조건문 내에서 일반 상수에 옵셔널 값을 대입해 옵셔널을 해제하는 방법입니다. nil인지를 먼저 체크하고 옵셔널을 해제하기 때문에 오류가 발생할 가능성이 없는 안전한 방법입니다. 크게 if let 구문과 guard let구문에서 사용할 수 있습니다. 먼저 if let 구문부터 살펴보겠습니다.

🍌 if let 구문

var str = "123"

if let value = Int(str) {
    print("옵셔널이 해제되었습니다. 추출된 값은 \(value)입니다.")
} else {
    print("옵셔널 해제에 실패하였습니다")
}
  
//실행 결과
  옵셔널이 해제되었습니다. 추출된 값은 123입니다.

if조건절에서 옵셔널 값이 nil이 아니라면 상수 'value'에 할당되면서 옵셔널 객체가 자동으로 해제 됩니다. 그리고 뒤의 구문이 실행됩니다. 반면, 옵셔널 값이 nil이라면 상수 'value'에 값 할당을 실패하면서 false를 반환되고 else 블록이 실행됩니다.

⚠️ 단, 상수 'value'는 if let 구문 내에서만 사용 가능합니다.

옵셔널 바인딩은 옵셔널의 값이 nil일지라도 else 블록이 실행되기 때문에 오류를 발생시키지 않고 옵셔널을 해제 할 수 있는 안전한 방법입니다.


🍌 guard let 구문

guard 구문은 특성상 함수나 메소드에서만 사용 할 수 있기 때문에 함수를 정의하고 그 안에 guard 구문을 작성합니다.

var str = "123"

func unwrap(str:String){
   
   guard let value = Int(str) else{
   print("옵셔널 해제에 실패했습니다")
   return
  }
  
  print("옵셔널 해제에 성공했습니다. 추출된 값은 \(value)입니다.")
}
  
//실행 결과
  옵셔널 해제에 성공했습니다. 추출된 값은 123입니다.  

옵셔널 값이 nil이 아니라면 상수 'value'에 할당되고 guard 구문을 빠져나와 다음 구문을 실행합니다. 반면, 옵셔널 값이 nil이라면 else 블록을 실행하고 함수를 종료시켜버립니다. 따라서 guard let 구문은 실행 흐름상 옵셔널 값이 해제 되지 않으면 다음 진행에 큰 차질이 생길 경우에만 사용하는 것이 좋습니다.

⚠️ guard let 구문의 상수 'value'는 if let 구문과는 달리 guard구문 밖에서도 사용 할 수 있는 특징이 있습니다.



이렇게 옵셔널을 해제하는 두 가지 방법에 대해 알아보았습니다. 상황에 따라 적절한 방법을 선택해 사용하는 연습을 해보아야겠어요!

읽어주셔서 감사합니다😊 질문이나 피드백은 언제나 환영입니다!



📑 참고자료
이재은, 꼼꼼한 재은씨의 Swift: 기본편, 루비페이퍼, 2020

profile
i🍎S 개발을 합니다

0개의 댓글