6.2.1 옵셔널 강제 해제
옵셔널을 강제 해제하는 방법은 옵셔널 타입의 값 뒤에 "!"만 붙여주면 됩니다. 이 "!"를 강제 해제 연산자라고 합니다.
var optInt: Int? = 3
print("옵셔널 자체의 값 : \(optInt)") // 옵셔널 자체의 값 : Optional(3)
print("!로 강제 해제한 값 : \(optInt!)") // !로 강제해제한 값 : 3
이처럼 옵셔널 자체의 값은 Optional()로 감싸지고, 값이 있을 때 강제 해제를 하면 내부의 값이 추출됩니다.
Int("123")! + Int("123")! // 246
Int("123")! + 30 // 153
이렇게 옵셔널을 해제하여 연산이 가능합니다. 하지만 nil일 때 "!"을 사용하면 오류가 발생합니다. 즉 강제 해제 연산자를 사용할 때는 옵셔널 값이 nil인지 체크가 필요합니다. nil이 아닐 때만 강제 추출해야 합니다.
var str = "123"
var intFromStr = Int(str)
if intFromStr != nil {
print("변환된 값은 \(intFromStr!)입니다")
} else {
print("값 변환에 실패하였습니다")
}
"123"은 Int 타입으로 변환이 가능하므로 intFromStr에는 Optional(123)이 담겨 있습니다. 즉 if 조건절에서 nil이 아니므로 if 구문이 실행됩니다.
변환된 값은 123입니다
만약 숫자 변환 불가능한 값이 들어가면 어떻게 될까요?
var str = "Swift"
var intFromStr = Int(str)
if intFromStr != nil {
print("변환된 값은 \(intFromStr!)입니다")
} else {
print("값 변환에 실패하였습니다")
}
입력된 문자열은 숫자로 변환 불가능하므로 intFromStr에는 nil이 담겨 있습니다. if 조건절이 거짓이므로 else 구문이 실행됩니다.
값 변환에 실패하였습니다
위 조건절에서 intFromStr과 nil 사이에 "!=" 연산자 앞뒤로 공백이 있는 것을 알 수 있습니다. 이것은 가독성을 위한 것이 아닙니다. 문법 오류를 방지하기 위한 목적입니다. 만약 공백을 두지 않으면 두 가지 경우로 해석 가능합니다.
intFromStr!=nil
// 해석1
(intFromStr)!=(nil)
// 해석2
(intFromStr!)=nil
해석1은 원래 의도대로 intFromStr 변수와 nil의 비교입니다. 해석2는 intFromStr 변수의 옵셔널 강제 해제 + nil 값의 할당입니다. 즉 해석의 차이가 발생하여 구문이 모호해질 수 있습니다. 컴파일러는 이를 확실하게 해석하지 못해 오류가 발생합니다. 따라서 공백을 주어야 합니다.
Last updated