Danny의 iOS 컨닝페이퍼
article thumbnail

Optional이란?

Swift에서 안정적인 코드를 작성하기 위해 필요한 매우 중요한 방법 중 하나입니다.

 

Optional은 값이 있을 수도 있고 없을 수도 있는 변수의 데이터 타입입니다.

 

표현식을 한번 봅시다.

var myNumber: Int? = nil

이와 같이 변수를 선언할 때 "?"를 사용하여 Optional을 표현합니다.

이 경우 변수에 값을 할당하지 않으면 기본값으로 nil을 반환하죠.

 

그러나 보통 앱을 실행하여 nil값이 나오게 되면 에러가 발생합니다.

따라서 해당값에 접근하기 위해 Optional Unwrapping 과정을 거쳐야 합니다.

 

옵셔널 언래핑(Optional Unwrapping)은 옵셔널의 nil 여부를 확인하고 만약에 값이 있다면 해당값을 사용하는 과정입니다.

이를 통해 nil값을 방지하고 안정적으로 코드로 사용할 수 있죠.

 

옵셔널의 이해

// Int? 라고 생각하면

[..., -3, -2, -1, 0, 1, 2, 3, ...] + nil

// 즉, 정수 값들 + nil (범위가 그냥 Int값 보다 크다.)
// 여기서 nil값을 벗기는 과정이 Optional Unwrapping

 

 

Optional Unwrapping의 방법

대표적으로 4가지 방법이 있습니다.

 

1. 강제 추출(Forced Unwrapping)

2. 논리적(조건문)으로 확인 후 추출

3. 옵셔널 바인딩(Optional Binding)

4. Nil-병합 연산자(Nil-Coalescing)

 

 

강제 추출(Forced Unwrapping)

값이 있을 거라는 확신이 들 때만 사용해야 한다. (오직 nil이 아닐 때 사용)

 

뒤에 "!"를 사용하여 강제로 언래핑을 시켜준다.

var optionalInt: Int? = 10

optionalInt!  // 10
var optionalInt: Int?

optionalInt!  // error

 

논리적(조건문)으로 확인 후 추출

조건식으로 nil이 아닌 것을 확인 후 강제 언래핑 사용.

var myOptional: Int? = 10  // Optional(10)

if myOptional != nil {
    print(myOptional!)     // 출력 결과: 10
}

 

또는 이와 같이 삼항 연산자로 표현도 가능

myOptional != nil ? print(myOptional!) : print("nil")

 

 

옵셔널 바인딩(Optional Binding)

옵셔널 바인딩은 안전한 코딩을 위해 매우 중요한 방법 중 하나입니다.

주로 if let / guard let을 사용하여 구현됩니다.

 

nil이 아닌 경우에만 상수에 값이 담길 수 있으므로

만약 옵셔널이 상수에 담긴다면 그 안전한 값을 사용한다라는 의미이다.

 

이해가 안 갈 수도 있으니 예제를 참고하자!

var myOptional: Int? = 10

if let unwrapped = myOptional {
    print(unwrapped)  // 출력 결과: 10
} else {
    print("myOptional is nil")
}
var myOptional: Int? = 10

guard let unwrapped = myOptional else {
    print("myOptional is nil")
    return
}

print(unwrapped) // 출력 결과: 10

 

 

Nil-병합 연산자(Nil-Coalescing)

옵셔널 값이 nil일 경우 대체 값을 반환하는 연산자를 말한다.

 

[옵셔널 값 + 물음표 2개(??) + 기본값]과 같은 형식으로 사용하며

 

만약 값이 nil이 아닐 땐 앞의 옵셔널 값을 자동으로 풀어서 사용하게 되고

값이 nil이면 뒤에 설정해 놓은 기본값을 사용하게 됩니다.

let optionalLastName: String?
let optionalFisrtName: String? = "Daniel"


let name = optionalFisrtName ?? "이름이 없습니다"  
// Daniel


// 또는 이와같이 여러개도 사용가능하다.
let fullName = optionalLastName ?? optionalFisrtName ?? "성 또는 이름이 없습니다"
// Daniel

 

 

부족한 설명이지만, 조금은 이해 가셨나요?

틀린 내용이 있다면 언제든지 지적해 주시면 감사히 받겠습니다. 🫠
읽어주셔서 감사합니다 😃

 

 

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!