본문 바로가기
카테고리 없음

6. 옵셔널(Optional)과 안전한 언래

by swifttt 2025. 3. 30.

 

Swift에서 옵셔널(Optional)은 값이 있을 수도 있고 없을 수도 있는 상태를 표현하기 위한 타입입니다. Objective-C에서 nil을 허용하는 것과는 달리, Swift는 값이 없음을 명시적으로 표현하고 이를 안전하게 처리할 수 있도록 설계되어 있습니다.

옵셔널은 Swift의 안정성을 높여주는 핵심 기능 중 하나이며, 이를 잘 다루는 것이 Swift 개발의 중요한 요소입니다.

1. 옵셔널 선언

var name: String? = "민수"
var age: Int? = nil

위 코드에서 nameString? 타입으로, 값이 존재할 수도 있고 존재하지 않을 수도 있습니다. age는 현재 nil로 초기화되어 있습니다.

2. 옵셔널이 필요한 이유

var city: String = "서울"
// city = nil  // 컴파일 에러 발생

옵셔널을 사용하면 nil을 포함할 수 있는 변수를 만들 수 있으며, 이로 인해 예상치 못한 nil 접근 오류를 컴파일 단계에서 방지할 수 있습니다.

3. 옵셔널 바인딩 (if let)

var nickname: String? = "코코"

if let unwrappedName = nickname {
    print("닉네임은 \(unwrappedName)입니다.")
} else {
    print("닉네임이 설정되지 않았습니다.")
}

옵셔널 바인딩은 값이 있을 경우에만 해당 블록이 실행되며, 내부에서는 안전하게 언래핑된 값을 사용할 수 있습니다.

4. 옵셔널 바인딩 (guard let)

func printAge(_ age: Int?) {
    guard let validAge = age else {
        print("나이를 알 수 없습니다.")
        return
    }
    print("나이는 \(validAge)세입니다.")
}

guardelse 블록 안에서 반드시 return, break 등을 포함해야 하며, 바깥에서는 validAge를 안전하게 사용할 수 있습니다.

5. 강제 언래핑 (!)

var email: String? = "user@example.com"
print("이메일: \(email!)")  // 강제 언래핑

이 방법은 정말로 값이 확실히 있다고 보장될 때만 사용해야 합니다.

6. nil 병합 연산자 (??)

var inputName: String? = nil
let finalName = inputName ?? "사용자"
print("이름: \(finalName)")

inputName이 nil이므로 "사용자"가 대신 출력됩니다.

7. 옵셔널 체이닝

struct Person {
    var pet: Pet?
}

struct Pet {
    var name: String
}

let user = Person(pet: Pet(name: "초코"))
print(user.pet?.name ?? "이름 없음")

.pet이 nil이면 다음 단계로 넘어가지 않으며, 전체 결과는 옵셔널이 됩니다.

마무리

옵셔널은 Swift에서 매우 중요한 개념입니다. Swift는 값을 안전하게 다루기 위해 옵셔널을 기본적으로 요구하며, 이를 바르게 사용하는 것이 안정적인 코드 작성의 핵심입니다. 강제 언래핑보다 옵셔널 바인딩, nil 병합 연산자, 옵셔널 체이닝을 통해 안전하게 값을 처리하는 습관을 들이는 것이 중요합니다.