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