[swift] 옵셔널 타입과 옵셔널 타입이 아닌 타입 간의 연산하기

Swift에서는 값이 있을 수도, 없을 수도 있는 옵셔널 타입을 제공합니다. 옵셔널 타입은 값이 존재하지 않을 수 있는 변수 또는 상수를 선언할 때 사용됩니다. 하지만 옵셔널 타입과 옵셔널 타입이 아닌 타입 간의 연산은 문법적으로 다르기 때문에 주의가 필요합니다.

1. 옵셔널 타입과 옵셔널 타입이 아닌 타입 간의 연산 방법

1) 옵셔널 타입과 옵셔널 타입 연산

옵셔널 타입과 옵셔널 타입 간의 연산은 간단합니다. nil이 할당된 옵셔널 타입과 다른 옵셔널 타입의 값을 비교해도 안전하게 동작합니다.

var optionalValue: Int? = 10
var anotherOptionalValue: Int? = 5

var result = optionalValue + anotherOptionalValue // 옵셔널 타입과 옵셔널 타입의 덧셈

print(result) // Optional(15)

2) 옵셔널 타입과 옵셔널 타입이 아닌 타입 연산

하지만 옵셔널 타입과 옵셔널 타입이 아닌 타입 간의 연산에서는 주의해야 합니다. 옵셔널 타입에는 nil이 할당될 수 있기 때문에 값이 nil인지 아닌지 확인해야 합니다.

var optionalValue: Int? = 10
var nonOptionalValue: Int = 5

var result = optionalValue + nonOptionalValue // 옵셔널 타입과 옵셔널 타입이 아닌 타입의 덧셈

print(result) // 컴파일 에러!

위의 예제에서는 옵셔널 타입과 옵셔널 타입이 아닌 타입인 Int를 더하려고 했지만 컴파일 에러가 발생합니다. 이는 옵셔널 타입인 optionalValue가 nil일 수 있기 때문에 정확한 연산 결과를 도출할 수 없기 때문입니다.

2. 연산 결과의 옵셔널 해제 방법

옵셔널 타입과 옵셔널 타입이 아닌 타입 간의 연산을 수행한 결과는 옵셔널 타입으로 반환됩니다. 따라서 결과를 사용하기 위해서는 옵셔널 해제를 해주어야 합니다.

1) 옵셔널 해제 연산자 ! 사용

var optionalValue: Int? = 10
var nonOptionalValue: Int = 5

var result = optionalValue! + nonOptionalValue // 옵셔널 해제 연산자 사용

print(result) // 15

위의 예제에서는 optionalValue를 옵셔널 해제 연산자 !를 사용하여 옵셔널 값을 해제하고 연산을 수행했습니다. 이를 통해 정상적으로 결과를 출력할 수 있습니다. 하지만 옵셔널 해제 연산자를 사용할 때에는 주의해야 합니다. nil 값에 대해 옵셔널 해제 연산자를 사용하면 런타임 에러가 발생할 수 있습니다.

2) 옵셔널 바인딩을 통한 해제

var optionalValue: Int? = 10
var nonOptionalValue: Int = 5

if let unwrappedValue = optionalValue {
    var result = unwrappedValue + nonOptionalValue // 옵셔널 바인딩을 통한 해제
    
    print(result) // 15
} else {
    print("optionalValue의 값이 nil입니다.")
}

위의 예제에서는 옵셔널 바인딩을 사용하여 optionalValue를 해당 코드 블록 내에서 해제하고 연산을 수행했습니다. 옵셔널 바인딩은 옵셔널 값이 nil이 아닌 경우에만 해당 코드 블록을 실행하므로, 안전하게 옵셔널 값을 해제할 수 있습니다.

3. Conclusion

Swift에서는 옵셔널 타입과 옵셔널 타입이 아닌 타입 간의 연산을 다룰 때 세심한 주의가 필요합니다. 옵셔널 타입과 옵셔널 타입 간의 연산은 값을 비교하는 것만으로도 잘 동작하지만, 옵셔널 타입과 옵셔널 타입이 아닌 타입 간의 연산에서는 옵셔널 해제와 옵셔널 바인딩을 사용하여 안전하게 값을 처리해야 합니다.

참고: The Swift Programming Language - Optional Chaining