본문 바로가기

Swift

[iOS] About Optional(옵셔널)

 

Optioanl

애플 공홈

옵셔널은 Swift에서 값이 있을 수도 있고 없을 수도 있는 상황을 안전한게 처리할 수 있도록 돕는 기능입니다.!!

변수 또는 상수의 값이 nil일 가능성을 나타내기 위해 사용되는 것이죠.

 

위의 공식문서에 나와있듯이

기본적으로 열거형으로 구현되어있습니다.

 

1. .some(Value): 값이 있는 경우

2. .none: 값이 없는 경우, 즉 nil

 

var number: Int? = nil

// or

var number: Int?

 

위의 형식처럼 ? 를 활용해 변수를 선언해줍니다.

첫번째처럼 nil을 지정해도 되지만 두번째 예시처럼 nil을 지정하지 않더라도 nil이 자동으로 할당됩니다.

 

여기서 중요한 점은 옵셔널로 정의한 변수는 일반 변수와는 다르다는 것인데요

var string1: String? = "iOS"
var string2: String = "macOS"

 

위의 예시를 보면

변수 하나는 옵셔널 나머지 하나는 String 값으로 선언했습니다.

 

그럼 서로의 값을 서로 대입해보면 어떻게 될까요?

string1 = string2

 

우선 옵셔널 타입으로 선언된 변수에 String 으로 선언된 변수를 대입하게 된다면..?

 

값이 잘 대입됩니다..!

string1에 "macOS"가 자동으로 Optional("macOS")로 래핑되는 것이죠

 

반면에

string2 = string1

 

이 경우엔?

 

값 대입이 불가능합니다. (컴파일 시점에 에러)

옵셔널 값을 옵셔널이 아닌 값에 할당하려면 반드시 언래핑 과정이 필요합니다. 

왜냐하면?

옵셔널 값엔 nil을 포함할 가능성이 있기 때문이죠

 

언래핑? 과정을 통해 옵셔널 값을 일반 변수 값에 할당할 수 있다고 했는데요

그럼 이제 언래핑은 어떻게 진행되는지 살펴보겠습니다.

 

 

강제 언래핑

워딩 그대로 값을 강제로 꺼내는 방식입니다.

다만, 값이 nil이 아닐 경우에만 사용해야하구요, 만약 nil일 때 사용하면 오류가 발생합니다. (주의!!!!)

let number: Int? = 10
print(number!) // 10

옵셔널 바인딩

옵셔널 바인딩엔 if let 바인딩과 guard let 바인딩이 있습니다.

기본적인 방법은 동일합니다.

옵셔널이 값이 있는지 없는지 확인한 후 안전하게 꺼내는 방법입니다.

nil이 아닌 경우와 nil인 경우에 대한 분기 처리를 해놓았기 때문에 오류가 발생할 일이 없는 것이죠

 

if let

if let number = number {
    print("Number is \(number)")
} else {
    print("Number is nil")
}

 

guard let

guard let number = number else { return print("값이 없습니다.") }

print("Number = \(number)")

 

다만 차이점이라고 한다면

if let 의 경우 if 문 내에서만 언래핑한 값을 사용할 수 있고,

guard let 의 경우는 해당 변수가 선언된 루프 내의 전문에서 사용 가능합니다.

 

 

Nil-Coalescing Operator 

옵셔널이 nil 일 경우 기본값을 제공하는 방식입니다.

print("Number = \(number ?? 5)")

 

옵셔널 체이닝

옵셔널 체이닝은 이를 통해 nil일 가능성이 있는 경우 안전하게 메서드나 프로퍼티에 접근할 수 있도록 합니다.

 

let person: Person? = Person(name: "John")
let city = person?.address?.city // address나 city가 nil이면 city 변수도 nil

 

옵셔널에 관한 내용은 이 정도 될 것 같습니다.

 

키워드는 

열거형

변수 값이 있을수도 있고 없을 수도 있는 상태 정의

컴파일 시점 오류판별

언래핑 과정(if-let, guard-let, 옵셔널 체이닝)

 

정도로 요약할 수 있을 것 같습니다!

 

그럼 이번 글은 여기까지!!

.

.

.

.

'Swift' 카테고리의 다른 글

[iOS] About CoreData  (0) 2024.10.13
[iOS] About ARC(Automatic Reference Counting)  (1) 2024.10.05
[iOS] About Copy-On-Write(COW)  (0) 2024.09.28
[iOS] About DI, DIP  (2) 2024.09.26
[iOS] About Realm  (1) 2024.09.25