
Swift의 공식 문서에는 아래와 같이 설명되어 있다.

감싸진 값 혹은 값이 없는(nil) 타입
Optional은 generic으로 구현되어 type parameter를 Wrapped 라고 부른다.
wrapped value를 표현한다.
Swift에서는 기본적으로 변수를 선언할 때 non-optional인 값, 즉 정해진 값을 변수에게 주어야한다.
하지만 어떠한 변수에 값이 안들어 갈 상황이 생길 수 있는데, 변수에 값이 확실히 있다는 것을 보장할 수 없을 때 Optional을 사용한다.
예를 들어 Int인 변수를 Optional type으로 사용하고 싶다면 초기화 시 타입 뒤에 ?를 넣어 Int?로 사용하면 된다.
var num: Int = nil // Error
var num: Int? = nil // Correct
print(num) // nil
num = 1
print(num) // Optional(1)
num을 print하게 되면 1이 아닌 Optional(1)처럼 Optional()이 Wrapping 되어 출력이 되는걸 확인할 수 있는다.
Wrapping된 값을 Unwrapping 하는 방법은 3가지가 있다.
강제 추출은 Optional 값 뒤에 !를 붙인다.
이 방법은 단순하지만 해당 옵셔널이 값이 있다면 문제가 되지 않지만, 값이 없는 상황이라면 오류가 발생한다.
var num: Int? = nil
print(num!) // Error
num = 1
print(num1) // 1
가급적이면 Forced Unwrapping 사용은 지양하되, 사용하게 된다면 반드시 값이 있음을 보장하는 상황에서만 사용해야 한다.
옵셔널 바인딩은 if let이라는 스위프트의 새로운 문법을 통해 만약 옵셔널 변수의 값이 nil이 아니라면 옵셔널 변수를 Unwrapping 해주는 방법이다.
func unwrapNum(num: Int?) {
if let unwrappedNum = num {
print(unwrappedNum) // num이 nil이라면 실행되지 않음.
}
}
guard let else 문을 통해 Unwrapping 해주는 방식이다. guard 문의 특성 상 함수(메소드)에서만 사용되며, guard let 문의 조건을 만족하지 못하면 else 문으로 보내 함수 밖으로 return 시킨다.
func guardNum(num: Int?) {
guard let unwrappedNum = num else {
// num이 nil일 때
return
}
print(unwrappedNum) // num이 nil이 아닐 때
}
인스턴스의 프로퍼티나 메소드에 접근하기 위해 옵셔널 체인 연산자를 사용한다.
struct Student {
var name: String
var age: Int
}
var mina: Student?
mina?.name = "미나"
?? 연산자는 값이 포함되어 있는 경우에는 옵셔널을 벗긴 값을 반환하고, 없는 경우에는 default 값을 설정해줄 수 있다.
let num: Int? = nil
var newNum = num ?? "2"
print(newNum) // 2
Swift: Optional과 Optional 안전하게 사용하기
Swift Optional
[Swift] Optional