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"
옵셔널을 사용할 때 주의할 점
강제 언래핑(
!
)은 최대한 피해야 함if let
,guard let
을 활용하여 안전하게 사용옵셔널 체이닝(
?.
)을 사용하여 연속적인 속성 접근기본값(
??
)을 활용하여 nil 방지