
var optionalName: String? = "변창원"
print(optionalName)
// Optional("변창원") <- 옵셔널로 감싸져 있어서 옵셔널 래핑된 상태!라고 이야기 함.
optionalName += "입니다" // 오류 발생
// 각각의 타입은 무엇일까요?
var optionalName: String? = "변창원"
optionalName은 String? 타입으로 선언되었습니다.String?는 옵셔널 문자열 타입입니다.print(optionalName)
// Optional("변창원")
print()로 옵셔널 값을 직접 출력하면 Optional("변창원")과 같이 출력됩니다.optionalName += "입니다" // 오류 발생
+= 연산자는 두 개의 문자열(String)을 연결하는 연산자입니다.optionalName은 String? 타입이고, "입니다"는 String 타입입니다.String?)과 비옵셔널 타입(String)은 서로 다른 타입이므로 직접 연산할 수 없습니다.optionalName: String? (옵셔널 문자열)"변창원": 초기에는 String이지만 optionalName에 할당되면서 String?로 래핑됨"입니다": String (일반 문자열)이 오류를 해결하려면 옵셔널을 언래핑해야 합니다. 몇 가지 방법이 있습니다:
if var name = optionalName {
name += "입니다"
print(name) // "변창원입니다" 출력
}
optionalName! += "입니다"
print(optionalName!) // "변창원입니다" 출력
let result = (optionalName ?? "") + "입니다"
print(result) // "변창원입니다" 출력
if optionalName != nil {
optionalName = optionalName! + "입니다"
}
print(optionalName!) // "변창원입니다" 출력
옵셔널은 마치 선물 상자와 같습니다:
optionalName은 "변창원"이라는 내용물이 들어있는 선물 상자입니다.print(optionalName)은 "이것은 선물 상자이고, 안에는 '변창원'이 들어 있습니다"라고 말하는 것과 같습니다.optionalName += "입니다"는 "선물 상자 자체에 '입니다'라는 글자를 붙이려고 시도"하는 것과 같습니다. 이는 불가능합니다.이처럼 Swift의 옵셔널 시스템은 값의 존재 여부를 명확히 하고, 안전하게 처리하도록 강제함으로써 런타임 오류를 방지하는 데 도움을 줍니다.