[Swift] 옵셔널(Optionals) 이해하기 – 언래핑, 강제 언래핑, 옵셔널 바인딩

Swiftios
avatar
2025.02.24
·
5 min read

Swift는 안전한 프로그래밍을 위해 nil 값을 허용하는 타입을 옵셔널(Optional)로 제공한다.

옵셔널을 올바르게 사용하면 런타임 크래시를 방지하고 안정적인 코드를 작성할 수 있다.

옵셔널(Optionals)이란?

  • 옵셔널은 값이 존재할 수도 있고 nil일 수도 있는 타입

  • 옵셔널을 사용하면 값이 없을 가능성을 표현할 수 있음

var name: String? = "춘장" // 옵셔널 변수
var age: Int? = nil // 값이 없을 수도 있음

?을 사용하여 변수에 nil을 저장할 수 있도록 선언

옵셔널의 필요성

옵셔널이 없으면 런타임 크래시 발생 가능

var name: String = "메주"
name = nil // 컴파일 에러 (Swift는 nil을 허용하지 않음)

옵셔널을 사용하면 안전한 코딩 가능

var name: String? = "감태"
name = nil // 정상 작동 (옵셔널이므로 nil 저장 가능)

옵셔널 언래핑(Unwrapping)이란?

  • 옵셔널 값을 사용할 때는 nil인지 확인 후 값을 꺼내야 함

  • 언래핑을 하지 않으면 직접 사용 불가능

var name: String? = "춘장"
print(name.count) // 컴파일 에러 (옵셔널은 직접 사용 불가)

해결 방법 → 언래핑(Unwrapping) 필요

옵셔널 언래핑(Unwrapping) 방법

강제 언래핑(Forced unwrapping, !)

강제 언래핑 시 nil일 경우 크래시 발생

var name: String? = nil
print(name!) // Fatal error: Unexpectedly found nil while unwrapping an Optional value

nil이 아님을 확신할 때만 사용

var name: String? = "메주"
print(name!) // "메주"

옵셔널 바인딩(Optional Binding, if let)

옵셔널 값이 존재할 때만 안전하게 사용 가능

var name: String? = "감태"

if let unwrappedName = name {
    print("이름: \(unwrappedName)") // "이름: 감태"
} else {
    print("이름이 없습니다.")
}

옵셔널 바인딩(guard let)

함수 내부에서 조기 종료(Early Exit)할 때 유용

func greet(_ name: String?) {
    guard let unwrappedName = name else {
        print("이름이 없습니다.")
        return
    }
    print("안녕하세요, \(unwrappedName)님!")
}

greet("춘장") // "안녕하세요, 춘장님!"
greet(nil) // "이름이 없습니다."
  • guard let은 옵셔널 값이 없을 경우 즉시 return하여 함수 실행을 중단할 수 있음

  • if let보다 코드 가독성이 좋음

옵셔널 체이닝(Optional Chaining)

옵셔널이 연속적으로 연결될 때 안전하게 접근 가능

class Person {
    var pet: String?
}

let person = Person()
print(person.pet?.count) // nil (크래시 없이 안전하게 실행됨)
  • ?.을 사용하면 값이 존재할 때만 실행됨

  • nil일 경우 실행되지 않고 nil 반환 → 크래시 방지

기본 값 제공(?? – Nil-Coalescing Operator)

옵셔널 값이 nil일 경우 기본값을 제공하는 방법

var name: String? = nil
print(name ?? "Unknown") // ✅ "Unknown"

옵셔널을 사용할 때 주의할 점

  1. 강제 언래핑(!)은 최대한 피해야 함

  2. if let, guard let을 활용하여 안전하게 사용

  3. 옵셔널 체이닝(?.)을 사용하여 연속적인 속성 접근

  4. 기본값(??)을 활용하여 nil 방지







- 컬렉션 아티클