Swift) Optional 부수기 (4) Optional Unwrapping - IUO (옵셔널 묵시적 추출)

⇒ 다시 정리할 때 이 부분 참고하고 Required, Failable, Deinit 에서 Failble에 반영하기

1. 옵셔널이란?

1-1. 기본적인 Swift 변수 선언 방식

기본적으로 Swift에서 변수를 선언할 때, non-optional인 값을 주어야한다! 즉 어떠한 값을 변수에 주어야 한다는 것! 하지만 만약 nil값을 주고 싶을 때는 어떠한 현상이 일어날까? 'nil' requires a contextual type 이라는 에러가 난다. 해석을 하자면 'nil'에는 상황별 유형이 필요합니다. → 즉 optional이 필요하다는 것이다!

왜 에러가 날까?

변수가 메모리에 저장될 때, 변수의 타입으로 인해 메모리를 차지하는 크기와 그 저장 구조가 결정된다. 근데 타입만 지정하고 값을 초기화하지 않으면 메모리 공간만 확보했을 뿐, 그 내용은 비어있다고 컴파일러가 인식하기 때문에 초기화가 필요하다는 에러가 나타난다.

따라서 값을 통한 초기화가 이루어져야만 에러 없이 변수를 활용할 수 있다.

// non-optional -> Swift에서 기본적으로 변수 선언 방식
var myBoyfriend = "장석우"
print(myBoyfriend)

var myBoyfriend = nil // error:'nil' requires a contextual type 

1-2. Optional?

그럼 만약 바로 값을 정할 수 없을 때, 즉 초기화를 미루고 싶을 때 어떤 방식을 써야될까? 이럴 때 우리는 Optional 타입을 사용하게 된다.

→ Optional 변수는 값이 있을 수도, 없을 수도 있는 변수를 뜻한다.

var myBoyFriend: String? = "장석우"
print(myBoyfriend) // Optional("장석우")

var mySecondBoyFriend: String? = nil
print(mySecondBoyFriend) // nil

Q. 엥 저기 앞에 Optional()은 왜 붙었어요?

값이 할당된 옵셔널 변수를 프린트해보면 Optional이 감싸져서 나온다. 우리 눈에는 String값을 뻔히 가지고 있는데, 왜 그냥 출력이 안되는지 의문이 드는데 아래 예시를 살펴보장!

var someValue:String? = "모애모애뀽"
var value:String = someValue // Value of optional type 'Int?' must be unwrapped to a value of type 'Int'