Swift

❓ Forced Unwrapping

_yunie 2024. 6. 26. 13:30

안녕하세요!

오늘은 저번에 이야기했던 Forced Unwrapping에 대해 알아보려고 합니다!

한 번 Optional이라는 상자를 뜯어보죠!

 

 

❓ Optional Unwrapping

자, 그전에 오늘도 관련 기본 개념부터 알아보고 갈게요

Optional Unwrapping이란 간단하게 Optional이라는 상자를 열어주는 작업이라고 했습니다

 

아, 난 귀찮은데 그냥 사용하면 안되나? 라고 생각하실 수 있는데..

만약 Optional Unwrapping을 거치지 않고 데이터를 사용하게 된다면?

 

 

이렇게! Optional이라는 상자가 데이터와 함께 표현됩니다

그렇기 때문에 제가 원하던 "안녕하세요! Yunie의 블로그입니다"의 형태가 출력되지 않음을 확인할 수 있습니다

 

원래의 의도대로 출력하고 싶다면 이 Optional Unwrapping이라는 과정을 거쳐주면 됩니다

즉, Optional Unwrapping을 통해 Optional Type이던 값이 Non-Optional Type으로 다시 태어나는거죠!

 

그럼 Optional Unwrapping으로 모든 Optional 상자를 열어주면 되냐고 물으신다면..~ 그건 또 아닙니다😅

 

옵셔널 타입에는 Yunie와 같은 값이나 nil이 들어갈 수 있다고 했죠?

그럼 userName에 nil을 대입해 줘도 Optional(Yunie)처럼 Optional(nil)로 출력될 것 같겠지만..

nil은 값이 아니기 때문에 그저 Optional이라는 상자 없이 나! nil! 하고 혼자 튀어나오고 맙니다

이는 곧 Optional이라는 상자도 결국 값을 감싸는 역할이기 때문에 값이 아닌 nil은 감싸주지 않음을 의미합니다

그러므로 nil에게 Optional Unwrapping 필요도 없는 행위일뿐더러, 해서는 안 되는 행위가 되게 됩니다

 

 

❓Forced Unwrapping (!)

오늘은 Optional Unwrapping 중에서도 간단하지만 지양해야 하는 Forced Unwrapping(강제 추출)에 대해 알아보겠습니다

 

Forced.. 여러분은 Forced라는 단어만 봐도 어딘가 위험한 방법일 것 같다는 생각이 들지 않으시나요?

개인적으로 개발 공부를 하면서 느끼는 것 중 하나는 어떤 행위이건 Forced(강제적)이라는 단어가 들어가면 문제가 생길 가능성이 있다는 거예요

 

그러니까 즉, 이 친구도 완전히 안전한 방법은 아니라는 거죠

그래도 일단 어떤 녀석인가 하고 살펴보면 정말 간단합니다

 

Optional을 해제해주고자 하는 변수/상수 뒤에! (느낌표)를 붙여주기만 하면 되거든요

바로 아래처럼요

아까 코드와의 차이는 느낌표 하나뿐인데 Optional(Yunie)로 나오던 값이 Yunie라는 Non-Optional Type으로 출력되네요

오, 옵셔널은 다 저 방법으로 해제하면 되나? 싶으실 텐데 아뇨! 안됩니다! 

 

왜 안되는지에 대해서는 이미지로 먼저 보여드릴게요

 

보이시나요 이 아름다운(?) 에러가..

 

에러의 내용을 살펴보면 Optional 값을 Unwrapping 하는 중에 예상치 못한 nil을 찾았어~라고 알려주고 있습니다

이 말을 더 이해하기 쉽게 설명드리자면

우선 우리가 저 코드를 실행시키면 컴파일러가 열심히 컴파일을 하기 시작합니다

그러던 중에 print문을 읽게 되고 userName! 을 마주치게 되는 거죠

그런데 개발자가 userName에는 상자(Optional)도 없는데 나 상자 열어서 값 꺼낼게 하고 userName!라고 명시해 둔 겁니다

그래서 컴파일러는 얘 상자도 없는 nil인데? 하고 알려주게 됩니다

 

이처럼 Forced Unwrapping은 값이 들어있든 말든 Optional 해제해 줘라고 명시해 주는 역할을 합니다

하지만 nil은 값이 아니기 때문에 Optional로 포장되어 있지 않죠

그렇기 때문에 바로 전의 예시처럼 nil을 Forced Unwrapping 하면 에러가 발생하게 됩니다

그리고 해당 에러는 앱을 강제로 꺼트리게 되죠

 

그러므로! 을 사용할 때에는 정말 100% 값이 들어있음을 확신할 때에만 사용해야 합니다

아니면 if-else문으로 처리해 줄 수도 있는데, 옵셔널을 해제하는 데에는 좀 더 일반적인 Optional Binding이라는 방법이 쓰이기 때문에 실사용은 없다고 생각해 주시면 됩니다 (그래도 그렇게라도 문제를 해결해보려고 하는 마인드는!)


저도 빠르게 데이터를 확인해보고 싶을 때나 어떠한 경우에서는 값이 100% 있음을 알고 있어서 사용하곤 하는데, 최근에 좋지 않은 방법인 것 같다고 피드백을 받았답니다.....🥲

그러니까 여러분도 Forced Unwrapping은 지양하는 방향으로 공부해 주시면 좋을 것 같네요!

 

 

✏️ 오늘의 요약

  • Optional Unwrapping
    • Optional Type을 Non-Optional Type으로 변환해 주는 과정
    • 옵셔널 타입의 데이터를 사용하고 싶다면 꼭 거쳐야 하는 과정
    • nil은 값이 아니므로 해당 과정이 필요 없음 
    • Forced Unwrapping, Optional Binding 등의 방법이 있음
  • ! (Forced Unwrapping)
    • nil이든 값이든 옵셔널을 강제로 해제
      • 해당 변수/상수가 nil인 경우, 에러를 일으킴
        • 그러므로 100% 값이 있음을 확신할 때만 사용하기 

 

'Swift' 카테고리의 다른 글

❓ Implicitly Unwrapped Optional  (1) 2024.07.01
❓ Optional Binding  (0) 2024.06.28
❓ Optional  (0) 2024.06.24
❓ Type Inference / Type Annotation  (0) 2024.06.21
❓ 접근 제어(Access Control)  (0) 2024.06.17