Swift

❓ Optional

_yunie 2024. 6. 24. 09:06

안녕하세요!

드디어 감기에서 벗어난 Yunie입니다!

오늘부터 옵셔널에 대해 조금씩 알아보려고 합니다

아마 다음 글은 Optional Unwrapping에 대한 글이 되겠네요 :)

 

❓ nil

옵셔널에 대해 알아보기 전에 nil이라는 개념에 대해 먼저 이해하고 넘어가는 게 좋을 것 같아요

nil은 Int타입의 0이나 String타입의 ""와 달리 정말 아무런 값이 없음을 이야기합니다

 

🧐 그럼 nil은 언제 사용되나요?

보통 앱의 로직이 어딘가 잘못되었거나 원하는 결과를 받아오지 못했을 때 등 앱이 강제로 꺼져버리는 경우가 발생합니다

이러한 경우를 런타임 에러라고 하죠?

그럼 런타임 에러가 발생할 가능성이 있는 앱을 우리는 안정적이라고 할 수 있을까요?

아마 아닐겁니다

 

그래서 애플은 앱의 안정성을 위해 nil이라는 개념을 도입하게 되었습니다

쉽게 말해 찾는 데이터가 없다고 앱을 꺼버리는 것이 아니라 nil값을 던져줘서 오류가 있다는 점은 알아둬! 하고 알려주는 거죠

 

이는 딕셔너리를 예시로 두면 이해하기 쉽습니다

만약 아래와 같은 딕셔너리가 있다고 해봅시다

let character = ["sanrio": "hellokitty", "pingu": "pinga"]

 

산리오라는 key로 헬로키티와 핑구라는 key로 핑가를 value로 가지고 있어요

그런데 여기서 카카오프렌즈라는 key로 캐릭터를 찾으려고 한다면?

 

위 이미지처럼 character 딕셔너리에 그런 key의 value는 없어~하고 nil이라는 데이터를 넘겨줍니다

nil이 어떤 의미인지 이해되셨을까요?

 

 

❓ Optional

그럼 이제 정말 옵셔널에 대해 알아볼 차례입니다!

아래 코드를 한 번 볼게요

var petName: String?

 

우리가 아는 평범한 변수 선언문 같은데 무언가 다른 점이 보이시나요?

String 뒤에 있는 저 물음표! 저게 우리가 알고 싶은 옵셔널입니다

 

옵셔널이 있는 String 선언문과 일반적인 String 선언문은 어떤 차이가 있을까요?

var petName: String

 

우선, 이렇게 선언해 왔던 변수 또는 상수를 Swift에서는 Non-Optional Type이라고 합니다

그 의미 그대로 옵셔널 타입이 아니다라고 말해주는 거죠

 

그리고 방금 봤던 이런 변수가 옵셔널이 붙어있기 때문에 Optional Type이라고 얘기합니다

var petName: String?

 

 

이렇게 타입명도 다르지만 아주 명확한 차이가 존재합니다

바로 Optional Type에는 우리가 위에서 알아본 'nil'이 대입가능하다는 점입니다

 

본격적으로 위의 코드들로 개념을 살펴보면 현재 옵셔널이 포함되지 않은 String 타입으로 petName이라는 변수를 선언하고 있습니다

그런데 누구는 반려동물이 있을 수 있고 누구는 반려동물이 없을 수 있습니다

그래서 반려동물이 없다는 의미로 공백("")을 넣어주기로 했습니다

var petName: String = ""

 

하지만 얘기했다시피 공백 또한 결국 어떠한 값이 존재하는 것은 마찬가지입니다

그러니까 A라는 사람의 데이터에서 petName이 ""로 선언되어 있다면 그 코드를 보고 제삼자는 아 이 사람은 반려동물을 막 데려와서 이름을 아직 못 지어줬구나~ 하고 생각할 수 있는 겁니다 (물론 아닐 수도 있지만요😉)

 

그래서 A라는 사람은 반려동물이 없어!라는 의미를 보다 명확히 해주기 위해 petName을 String?이라는 옵셔널 타입으로 정의해 주고

var petName: String? = nil

 

이렇게 아무 데이터도 없음을 나타내는 nil을 대입해 줄 수 있습니다

그럼 다른 사람이 봤을 때에도 A는 반려동물이 없구나 하고 유추할 수 있을 거예요

 

그리고 추후에 반려동물을 키우게 됐다면

petName = "인절미"

 

이런 식으로 우리가 아는 Strin 타입의 문자열을 넣어줄 수도 있습니다!

 

이처럼 Optional Type은 자주 사용하는 Non-Optional Type과 달리 nil과 명시해 준 데이터 타입값 모두 넣어줄 수 있습니다

 

🧐 Optional Type과 Non-Optional Type은 또 달라요!

Non-Optional Type과 Optional Type의 또 다른 점을 찾기 위해 둘을 모두 print 해볼게요

 

같은 값을 넣어줬는데, 타입이 다르다는 이유로 petName2는 Optional()로 감싸져 있는 것을 확인할 수 있습니다

 

Optional Type은 일반적인 타입을 Optional이라는 상자로 포장해 둔 상태(아래 이미지 참고)라고 생각할 수 있습니다

Non-Optional Type / Optional Type

 

그리고 이렇게 Optional로 감싸져 있는 타입을 Optional Type, 보다 구체적으로 말하자면 Optional String Type이라고 합니다

만약 Bool?이라면 Optional Bool Type이라고 말할 수 있습니다

 

택배가 오면 택배 상자를 꺼내 내용물을 꺼내는 것처럼 Optional Type은 Optional이라는 상자 안에 데이터가 들어있어 우선 상자를 열어주는 작업을 거쳐야 합니다 

그리고 그러한 작업을 Optional Unwrapping이라고 합니다!

 

Optional Unwrapping에는 Optional Binding과 Forced Unwrapping 등 여러 방법이 있습니다

다음 글에서는 Optional Binding부터 다뤄볼게요😆

 

 

✏️ 오늘의 요약

 

 

📚 참고

https://josee2.tistory.com/20

https://babbab2.tistory.com/15

'Swift' 카테고리의 다른 글

❓ Optional Binding  (0) 2024.06.28
❓ Forced Unwrapping  (0) 2024.06.26
❓ Type Inference / Type Annotation  (0) 2024.06.21
❓ 접근 제어(Access Control)  (0) 2024.06.17
❓ Delegate와 DataSource의 차이  (1) 2024.06.10