본문 바로가기

iOS/Swift

Swift) Optional 부수기 (1) Optional 정의 , nil , Non-Optional Type vs Optional Type

안녕하세요 소들입니다 😎

이번에 맥북 프로 큰 맘 먹고 질렀더니

이모지 쓰기 세상편함 🌺🌸🌼

개발이 1.5배 정도 잘 될 것 같은 느낌 ?

쨌든 본론으로 갑시다

 

 

.

.

여러분

스위프트 언어의 꽃은 무엇일까요?

옵젝씨나 다른 언어를 개발하다가 스위프트를 처음 접하면

가장 이해하기 힘들고 난해한 개념이 바로

 

옵셔널(Optional)

 

이라는 개념입니다!

스위프트의 시체꽃임

 

그러니 이 옵셔널을 차근차근 공부해 나가볼 예정입니다 🤦🏻‍♀️

스위프트 포스팅은 말좀 편하게 할게요~~~

 

 

 

 

1. 옵셔널의 정의

 

옵셔널이 뭘까요??????

뭔가 선택적인 건가??뭐지??? 제가 지금 뒤에 물음표 많이 붙이죠???

스위프트를 한번이라도 접했다면 다음과 같은 ?(물음표)를 많이 보셨을 거

 

 

 

 

이런 거

변수를 선언하거나 할 때 타입 뒤에 붙어있는 저 물음표 녀석이 바로 옵셔널이에요

정의부터 봅시다

 

Optional은 nil을 사용할 수 있는 타입과 없는 타입을 구분하기 위함이며,

nil을 사용할 수 있는 Type을 Optional Type이라 부른다

 

넹 쉽게 정리하면

 

'nil' 이라는 값을 가질 수 있으면 Optional Type이고,

이 Optional Type을 선언할 땐 타입 옆에 ?(물음표)를 붙인다

 

?? 모라는거 

일단 그냥 글쿤 하고 넘어 가셈

 

 

 

 

2. nil이란?

 

뭐 nil을 가질 수 있으면 Optional이라니 뭐라니 하는데

그렇다면 먼저 nil이 뭐임!?

 

결론부터 말하면 "값이 없음"을 뜻함

 

nil은 Objective-C에도 있는 개념이지만 Objective-C와는 개념이 조금 다름

Objective-C에서는 빈 포인터를 가리킬 때 nil을 사용하지만 (보통 다른 언어에선 NULL)

스위프트에선 직접 포인터를 접근할 일도 없을 뿐더러, 오로지 값이 없음을 나타낼 뿐임

 

그럼 언제 nil을 사용 하냐면

 

너 방금 오류났어 근데  이 정도로 앱을 중단시키긴 좀 그러니까

프로그램의 안정성을 위해 오류는 안 낼게

대신 nil을 돌려줄테니 너 오류인 건 알고 있어라

 

이럴 때 사용함

때문에 Optional을 Swift 언어의 안전성에 해당한다고 함

찾는 값이 없다고 Crash를 발생시키는 것이 아닌, nil을 발생 시키니까

 

쨌든

예를 들어 보겠음

 

 

 

 

이런 딕셔너리가 있을 때,

실제 존재하는 "name"이라는 키에 접근 해보면

 

 

 

 

잘 출력 됨

 

근데,

존재하지 않는 key 값인 "alias"에 접근 해보겠음

 

 

 

 

실제 human이란 딕셔너리엔 "alias"라는 키 값이 없기 때문에 이것은 오류임

근데 그렇다고 너가 입력한 키 없어!하고 컴파일 에러를 내버리기엔 너무하잖슴

 

그렇다고 리턴을 안 할수도 없고,

오류 났다고 알려줘야 하는데 0이나 공백("")을 리턴해줄 수도 없음 

왜냐? 이것들도 결국 값이기 때문

(0도 숫자 리터럴이고, 실제 Value 값이 "" 일 수도 있으니)

 

쨌든 이럴 때 사용하는 것이 바로 nil임

 

 

 

 

 

야 너가 원하는 값 없다!!! 하고 오류를 반환하지 않는 대신,

nil을 반환해주는 것임

 

nil이 뭔지 대충 감 옴?

안왔으면 다시 차근차근 읽어보셈

 

 

 

 

3.  Non-Optional Type vs Optional Type

 

바로 위에서 nil은 오류가 발생했을 때 오류대신 뱉는 값이라고 했음

그렇다면 어떤 자료형이든 nil을 반환하고 저장할 수 있을까?

이걸 묻는 이유가 뭐겠음

당연히 안댐

 

nil은 특수한 값이기 때문에,

일반적으로 쓰이는 자료형은 nil 값을 담지 못함

nil을 저장할 수 있는 건 오로지 Optional로 선언된 자료형만임

이제 nil을 사용할 수 있는 타입과 없는 타입에 대해 공부할 거임

 

 

 (1) Non-Optional Type 

 

여러분이 지금껏 암 생각 없이 정의해 온 변수(상수)가 있을 거임

(다른 언어로 생각 X, Only Swift에서만)

 

 

 

 

선언과 동시에 초기화를 해주든가

 

 

 

타입 어노테이션을 사용하든가

어쨌든 이런 식으로 우리가 써왔던 변수(상수) 타입을

 

Non-Optional Type 

 

이라 부름

여러분이 지금껏 막 선언한 변수는 모두 Non-Optional Type이었던 것임

 

 

이 Non-Optional Type의 특징은

 

무조건 값을 가져야 함

 

Non-Optional Type에서 값이 없을 경우 에러가 남

 

예를 들어

 

 

 

 

위 코드로 설명할 수 있음

name이라는 변수를 만든 것 까진 ㅇㅋ

근데 선언만 해주고 값을 대입하지 않았음

 

그런 상태에서 name에 접근을 하려 하면

name에 지정된 값이 없기 때문에 

 

위 구문은 에러가 발생함

 

왜냐?

Non-Optional Type은 무조건 값이 있다는 전제가 달려 있으니께

 

 

 

그럼 만약 이같은 Non-Optional Type에

nil 이라는 "값 없음"을 지정하면 어떻게 될까?

 

 

 

 

쨔쟌 에러 떠

 

 

 

String type에 nil을 지정할 수 없대.. 

 

왜냐면 앞서 누누히 말했 듯이

nil을 저장할 수 있는 것은 오직 Optional Type 만 가능하기 때문임

 

 

근데 좀 의아하지 않음?

String type에 nil을 저장할 수 없다란 말은

Optional로 선언하면 String type이 아니란 것인가?

 

ㅇㅇ 아님

그럼 뭔 타입인지 공부해 봅시다

 

 

 (2) Optional Type 

 

자  Optional Type의 변수를 선언해 봅시다

Optional Type의 변수를 선언하는 방법은 다음과 같이 하면 댐

 

 

 ① Type Annotation을 이용하기 

 

Type Annotation을 이용하여 Optional을 선언하기 위해선

다음과 같이 자료형(Type)의 뒤에 ?를 붙여주면 됨~~

(Type Annotation을 모른다면 이거 읽고 오셈)

 

 

 

 

완성~~~  ^ ^

 

 

 

 

?로 선언된 name엔 nil 값을 저장할 수 있음

 

 

 ② Type Inference를 이용하기 

 

다음으론 타입 추론을 이용한 방법임

기존과 같이 선언과 동시에 값을 초기화 해주면 되는데,

Optional로 선언하고 싶다

 

초기화 되는 값이 무조건 Optional 자료형

 

이여야만 함

 

 

 

 

위 구문처럼

이미 옵셔널 타입의 값인 a를 b에다가 선언과 동시에 초기화 해주면

 

 

 

 

b도 옵셔널 타입으로 선언됨

 

타입 추론에 대해 알고 있다면 당연한 거임

타입 추론은 초기값의 자료형을 보고 타입을 지정하기 때문에,

초기값 a의 자료형이 Optional이면 당연히 b의 자료형도 Optional로 추론됨

 

이처럼 이미 옵셔널 타입으로 선언된 변수나 상수를 이용해서 초기화 하면,

옵셔널 타입의 변수나 상수를 만들 수 있음

 

아까 처음에 nil 설명할 때 했던

 

 

 

 

이 구문이 가능한 이유는

human이라는 딕셔너리에서 value 값을 가져오는 [](서브스크립트)의 원형을 보면

 

 

 

리턴 값이 옵셔널(Value?)로 선언되어 있음

 

따라서 human["alias"]의 리턴 값은 옵셔널 자료형인 거고,

상수 alias는 타입 추론에 의해 옵셔널 자료형을 갖게 된 것임

따라서 nil이라는 값을 받을 수 있던 게지

 

 

.

.

다만

다음과 같이는 사용하면 안됨

 

 

에러남 

당연히 안되는 구문이지만 설명 해보자면

저렇게 선언하면 nil 값이 어떤 자료형인 줄 아는 사람!?

 

컴파일러는 저 구문만 보고 자료형에 맞는 메모리를 할당해야 하는데,

 

nil은 말 그대로 '없는 값'일 뿐 자료형을 유추할 수 없음

 

따라서 컴파일러는 자료형 몰라! 메모리 할당 못해! 하고 에러를 뱉는 것임

쨌든 Optional 타입의 자료형을 선언하는 방법은 위 두 가지를 통해서 할 수 있음

 

.

.

그럼 다시 돌아가서

Non-Optional Type을 설명할 때

String에 옵셔널을 붙이면 String Type이 아니라고 했는데

 

난 다음과 같이

 

 

 

 

분명 String 타입이라고 Type Annotation까지 해줬는데 (뒤에 물음표가 붙긴 했지만)

String 타입이 아니란 말임?

 

비교하기 위해 Non-Optional Type과 같이 찍어 보겠음

 

Non-Optional Type 값과 Optional Type 값의

자료형을 찍어 보면

 

 

 

결과 값이

 

 

 

 

다름!!

 

 

Non-Optional Type의 경우 String Type 이지만

Optional Type의 경우 Optional<String> Type

 

 

좌: Non-Optional String , 우 : Optional String

 

 

한마디로 위 그림과 같이 String을 Optional로 한번 감싼 Type임

그리고 이를 Optional String Type (옵셔널 스트링 타입) 이라고 부름

(일반 String Type과 엄연히 다른 타입임)

만약 Int형이라면 Optional Int Type

 

옵셔널 타입은 기존 자료형을 Optional이란 포장지로 한번 포장해버렸기 때문에

 옵셔널 타입의 값을 사용할 땐, 옵셔널이란 이 포장지를 까고 써줘야 됨

이것이 Optional Unwrapping 임 

 

다음 포스팅에서 다루겠음

 

 

 

 

.

.

.

 

자 Optional에 대한 기본 개념은 다 살펴봤습니다~~ 짞짞짞짝

다음 포스팅은

 

Optional의 포장지를 까는 방법에 대해 들고 오겠습니다

 

혹시 잘못된 개념이나 

오타 발견하시면

댓글 환영합니다 :-)



Calendar
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
최근 댓글
Visits
Today
Yesterday