[ios_Swift] Optionals/Unwrapping

이시영·2023년 8월 3일

Swift는 타입을 지정해주지 않아도 형식 추론으로 타입을 지정해주는데 만약 값을 정해주지 않으면 타입추론을 할 수 없어 컴파일 에러가 발생한다.

let noValue
// error

때문에 Type annotation으로 타입을 선언해주거나 값을 지정해주어야한다.
let value : Sting

let value = "Result"

그럼 이 상태에서 값을 읽으면 어떻게될까?
let value : Sting

print(value)
// error

결과는 상수 value가 초기화 되지 않고 사용되었다는 에러가 발생한다.
변수(var)와 상수(let)은 값을 읽기 전에 반드시 초기화를 해줘야한다.
또한 변수와 상수는 항상 타입에 맞는 값을 가지고 있어야 하는데 이를 Non Optional Type 이라고 한다.

만약 저장할 값이 없는경우, 예를들면 네트워크에서 가저온 값으로 상수를 초기화해야 할 때 연결불량등으로 값을 가져오지 못하면 값이 없다는것을 표현해야 한다. 그러나 항상 값을 가지고 있어야하는 Non Optional Type에서는 이러한 표현이 불가능하다. 이런 경우 사용되는 타입이 값을 저장하지 않아도 되는 Optional Type이다.

Oprional에서는 값이 없음을 나타낼때 다음과 같이 표현하면 된다.

let count : Int? = nil

Optional Type은 상수나 변수를 선언할 때 type name 앞에 '?'를 붙여주면 만들어진다. Optional Type의 경우 값으로 없음을 나타내는 nil을 저장할 수 있으나 Non Optional Type은 값으로 nil을 저장할 수 없다.
let count : Int = nil
// error
let count : Int? = nil
// count = nil

만약 표현식(Expression)이 nil이나 Optional로 도출된다면 이를 Optional Expression 이라고 부른다.

let a : Int? = nil
let b = a
b

또한 Oprional 은 아래와 같은 방법으로도 표현할 수 있다.

let a : Optional<Int> = nill

Unwrapping

Optional Type은 연관값이라는 특별한 방법으로 값을 저장하는데
때문에 값을 출력할때도 독특한 형식으로 출력된다.

let a : String? = "Hello"
print(a)
// Optional("Hello")

쉽게 말하면 값이 무언가로 싸여있다, 랩으로 포장되어 있다고 할 수 있다. 때문에 값을 사용하기 위해선 값을 꺼내야하는데 이를 Unwrapping 이라고 한다.

Unwrapping 중에서 값을 강제로 추출하는 방법을 Forced Unwrapping이라고 하는데 Optional Expression에 '!'를 붙임으로 사용할 수 있다.

let a : Int? = 123
print(a!)
// 123

강제 언랩핑(Forced Unwrapping) 진행시 주의해야 할 점도 있는데 만약 Optional 값이 nil이라면 앱이 강제로 꺼지는 오류인 fatal error 를 발생한다.
let a : Int? = nil
print(a!)
// fatal error

즉 강제 언랩핑은 nil 이 아닌 값이 있을 경우만 진행할 수 있다. 만약 값이 nil 인지 아닌지 애매한 경우 아래와 같은 방법을 사용 할 수도 있다.
let num :Int? = nil

lf num != nil {
	print(num!)
}

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

유익한 자료 감사합니다.

답글 달기