본문 바로가기
iOS/Swift

[iOS/Swift] Optional, Swift의 꽃

by iosdevlime 2022. 10. 31.

앞서 포스팅한

Swift 언어와 관련된 내용을 한 문장으로 정리하자면,,

 

유형(Type)을 결정하여 메모리에 자리를 잡고,

변수 혹은 상수선언을 통해 저장하고,

초기화 값이 있을 경우 할당한다!

 

 


 

그런데, 

 

위와 같이 메모리에 자리를 맡아두고, 저장하는 과정에서 (초기화)값이 없는 경우,

변수나 상수를 호출한다면 컴파일러에서는 어떤 반응을 보일까요?

(할당된 값이 없으니 '0' 이나, 오류를 발생시키진 않을까요?) 

 

 

여기서 탄생한 개념이 바로

🌼 Swift의 꽃🌼이라는 별칭으로 불리우는, Optional 입니다.

 

 

 


 

 

Optional이 왜 필요할까?

변수와 상수에 값이 할당되지 않은 상황을 처리하기 위한 안전하고 일관된 접근방식 제공 

 

Optional은 Swift의 특징 중 하나인, '안정성'을 위해 구현된 개념입니다.

 

위에서 언급한 바와 같이,

초기화 값이 없는 선언예시를 살펴보도록 하겠습니다.

// String 타입의 'someValue'란 변수를 선언하되, 초기화 값이 없는 경우
var someValue: String

// print 구문을 활용하여 someValue를 호출하면? 
print(someValue)

위와 같이 초기화가 되기 전에 SomeValue가 사용이 되었다! 란 메세지의 컴파일 오류가 발생합니다!

위와 같이 초기화가 되기 전에 SomeValue가 사용이 되었다! 란 메세지의 컴파일 오류가 발생합니다!

 

 

SomeValue란 이름의 String타입을 선언함으로서 저장공간만을 확보했을 뿐,

내용은 텅 비어있기 때문 이와 같은 오류가 나타납니다.

(반드시 초기화 값이 존재할 때 사용, 호출할 수 있습니다)

 

 

하지만 변수값의 초기화를 나중으로 미루고 싶은 경우, 

컴파일 오류에 대응함으로서 언어의 안정성을 보장하기 위해 Optional 이란 개념을 활용합니다.

 

 

 


 

 

 

Optional Type

타입은 타입인데...?  <Wrapped> 으로 한번 감싸져 있는 타입

 

 

정의

  • 기존 데이터 타입을 <Wrapped> 함으로서 내용물(초기값)의 할당을 나중으로 미룰 수 있습니다.
    • 컴파일러 관점에서 볼 때, 초기화가 되지 않은 Optional은 사실 'nil'이란 값을 가지게 됩니다.
    • 즉, 초기값이 없을 경우 오류를 발생시키기 때문에 nil이란 키워드값을 자동으로 할당합니다.
  • 기존 데이터 타입과 달리 '정수형', '문자형'이 아닌, '옵셔널 정수형', '옵셔널 문자형' 으로 불리게 됩니다.

 

 

구현방식

  • 변수 혹은 상수를 선언할 때, 데이터 타입 뒤에 물음표 (?)를 두어 Optional Type으로 변환합니다.
// 기본형태
// 데이터 타입 뒤에 물음표(?)를 붙인다

var index: Int?  // <--- 옵셔널 정수(Int)형

 

더보기
let optionalAge: Int?
// 초기화 값이 없음! 값의 타입 뒤에 물음표( ? )를 작성합니다.

var optioanlString: String? = "Hello"
// 근데, 마음이 바뀌어서 초기화 값 "Hello"를 선언하게 된다면..


let isOptionalStringNil: Bool = (optioanlString == nil) 
// 'isoptionalString'이란 bool 타입의 상수를 선언하고,
// "optionalString이 nil 인가 아닌가"란 값을 초기화 해준다면

print("isOptionalStringNil : \(isOptionalStringNil)") 
// 결과적으로 false! ("Hello"란 값이 있잖아..??)

'iOS > Swift' 카테고리의 다른 글

[iOS/Swift] 표현식(Expressions)과 연산자(Operators)  (0) 2022.11.02
[iOS/Swift] Optional, Unwrapped!  (0) 2022.10.31
[iOS/Swift] Basic Data Type ②  (0) 2022.10.30
[iOS/Swift] Basic Data Type ➀  (0) 2022.10.30
[iOS/Swift] Type Annotations  (0) 2022.10.29

댓글