[Swift] 기본 문법 - 옵셔널

있을 수도 있고, 없을 수도 있어 옵셔널의 뜻이죠 !
변수나 상수 등에 꼭 값이 있다는 것을 보장할 수 없다는 뜻 입니다. 즉, '변수 또는 상수의 값이 nil 일 수도 있다' 입니다 !

애매하죠?

자세히 한 번 알아봐요 ! 레츠고

옵셔널

코드를 사용하면서 육안으로 확인해봐요 !

var myName: String = "ian"
myName = nil // 오류 !
var myName: String? = "ian"
myName = nil 
print(myName) // nil

두 코드의 차이점이 보이시나요 ?
위의 코드는 오류가 뜨고, 밑의 코드는 정상적으로 작동합니다 !

myName: String 의 뒤에 물음표의 유무로 옵셔널 처리를 확인 할 수 있었습니다 !
? 를 통해 nil 값이 들어갈 수 있다 ! 를 선언해줬습니다 !

옵셔널은 열거형으로 구현되어 있습니다 !
옵셔널의 정의를 한 번 알아볼까요 ?

public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    /// The absence of a value.
    ///
    /// In code, the absence of a value is typically written using the `nil`
    /// literal rather than the explicit `.none` enumeration case.
    case none

    /// The presence of a value, stored as `Wrapped`.
    case some(Wrapped)

    /// Creates an instance that stores the given value.
    public init(_ some: Wrapped)

옵셔널은 제네릭이 적용된 열겨형 입니다.
ExpressibleByNilLiteral 프로토콜을 따른다는 것도 확인할 수 있습니다.
뒤에서 case none 은 값을 가지지 않는 케이스, case some 은 값을 갖고 있는 케이스가 되는데 연관값으로 Wrapped 가 있습니다. 따라서 옵셔널 값이 있으면 some의 연관값인 Wrapped에 값이 할당 됩니다.
즉, 값이 옵셔널이라는 열거형의 방패막에 보호되어 래핑되어 있는 모습이라 생각하면 됩니다 !

옵셔널 추출

옵셔널의 값을 옵셔널이 아닌 값으로 추출하는 방법이 있습니다 !

강제 추출

! 를 쓰는 방법 입니다. 가장 간단하지만 가장 위험한 방법이여서, 최대한 사용을 지양하는 걸 추천합니다 !
만약 강제 추출 시 옵셔널에 값이 없다면(nil) 이라면 런타임 오류가 발생합니다.

var myName: String? = "ian"
var ian: String = myName!

myName = nil
ian = myName! // 런타임 오류 !

if myName != nil {
    print("제 이름은 \(myName) 입니다 ! ")
} else {
    print("myName == nil")
}
// myNmae -== nil

런타임 오류의 가능성을 항상 갖고 있어서, 옵셔널 강제 추출 방식을 사용하는 걸 지양해야 합니다 !

옵셔널 바인딩

강제 추출 보단 안전하고 세련된 방식을 사용합니다 !
ifwhile 구문 등과 결합하여 사용할 수 있어요.

var myName: String? = "ian"

// 옵셔널 바인딩을 통한 임시 상수 할당
if let name = myName {
    print("제 이름은 \(name) 입니다 !")
} else {
    print("myNmae == nil")
}
// 제 이름은 ian 입니다 !

// 옵셔널 바인딩을 통한 임시 변수 할당
if var name = myName {
    name = "치킨" // var 변수이므로 내부에서 변경이 가능합니다 !
    print("제 이름은 \(name) 입니다")
} else {
    print("myName == nil")
}
// "제 이름은 치킨 입니다"

if 구문을 샐행하는 블록 안쪽에 name 이라는 상수 보이시죠 ?
옵셔널을 안전하게 바인딩 하고 name 상수에 넣어줍니다 !


옵셔널은 왜 사용할까요 ?

프로그래머 간의 원활한 소통을 위해 사용합니다 !

func optionalTest (name: String?) {
    print(name)
}
// optionalTest 에는 String과, nil 값이 들어가야 되는구나 !

func optionalErrorTest (name: String) {
    print(name)
}
// optionalErrorTest 에는 무조건 String이 들어와야 되는구나 !

라는 걸 추측할 수 있기 때문입니다 !


출처: 스위프트 프로그래밍(야곰), iOS 프로그래밍을 위한 스위프트 기초(야곰)

좋은 웹페이지 즐겨찾기