[Swift] 옵셔널 체이닝과 nil 병합 연산자

김형근·2024년 7월 21일

[Swift] 문법

목록 보기
14/20

🍎 [Swift] 옵셔널 체이닝과 nil 병합 연산자

  • Swift에서 옵셔널 체이닝(Optional Chaining)과 nil 병합 연산자는 옵셔널 처리와 관련된 중요한 기능입니다. 이 두 기능을 통해 안전하게 옵셔널 값에 접근하고, 기본값을 제공하여 코드의 안정성을 높일 수 있습니다.

🍏 옵셔널 체이닝 (Optional Chaining)

  • 옵셔널 체이닝은 연속적으로 연결된 옵셔널 값의 프로퍼티를 안전하게 접근할 수 있게 해줍니다. 이 기능은 옵셔널이 중첩된 경우 유용하며, 코드의 가독성을 높이고 오류를 줄이는 데 도움을 줍니다.
class Person {
    var name: String
    var job: String?
    var home: Apartment?
    
    init(name: String) {
        self.name = name
    }
}

class Apartment {
    var buildingNumber: String
    var roomNumber: String
    var `guard`: Person? // 경비원: 옵셔널로 설정
    var owner: Person?
    
    init(dong: String, ho: String) {
        buildingNumber = dong
        roomNumber = ho
    }
}

let geuni: Person? = Person(name: "geuni")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")

옵셔널 체이닝을 사용하면 geuni의 home 프로퍼티가 nil일 때도 안전하게 접근할 수 있습니다. 중첩된 옵셔널 프로퍼티를 간결하게 접근할 수 있어 코드가 보다 직관적입니다.


🧃 옵셔널 체이닝을 사용하지 않는 경우

  • 옵셔널 체이닝을 사용하지 않으면 각 단계에서 옵셔널 값을 안전하게 언래핑해야 하므로 코드가 복잡해지고 가독성이 떨어질 수 있습니다.
// 옵셔널 체이닝을 사용하지 않는 경우
func guardJob(owner: Person?) {
    if let owner = owner {                    // owner가 nil인지 확인
        if let home = owner.home {            // home이 nil인지 확인
            if let `guard` = home.guard {    // guard가 nil인지 확인
                if let guardJob = `guard`.job { // guard의 job이 nil인지 확인
                    print("우리집 경비원의 직업은 \(guardJob)입니다.")
                } else {
                    print("우리집 경비원은 직업이 없어요.")
                }
            }
        }
    }
}

guardJob(owner: geuni) // 출력: "우리집 경비원은 직업이 없어요."

옵셔널 체이닝 없이 각 단계에서 옵셔널을 언래핑해야 하며, 이로 인해 코드가 길어지고 가독성이 떨어집니다.


🧃 옵셔널 체이닝을 사용하는 경우

  • 옵셔널 체이닝을 사용하면 각 단계의 옵셔널 값을 안전하게 접근할 수 있으며, 코드가 간결하고 이해하기 쉬워집니다.
// 옵셔널 체이닝을 사용하는 경우
func guardJobWithOptionalChaining(owner: Person?) {
    if let guardJob = owner?.home?.guard?.job { // 옵셔널 체이닝을 사용하여 안전하게 접근
        print("우리집 경비원의 직업은 \(guardJob)입니다.")
    } else {
        print("우리집 경비원은 직업이 없어요.")
    }
}

guardJobWithOptionalChaining(owner: geuni) // 출력: "우리집 경비원은 직업이 없어요."

옵셔널 체이닝을 사용하면 guardJob의 값이 nil일 경우, 자동으로 else 블록으로 넘어가게 되어 코드가 간결하고 안전해집니다.


🧃 옵셔널 코드

  • 옵셔널 체이닝을 통해 옵셔널 값의 상태를 쉽게 확인하고 조작할 수 있습니다.
// 옵셔널 체이닝을 통해 직접 결과 확인
geuni?.home?.guard?.job // nil: geuni의 home이 없으므로 결과는 nil

// 집을 설정하고 경비원 설정
geuni?.home = apart
geuni?.home // Optional(Apartment): geuni의 home 프로퍼티에 apartment 설정됨
geuni?.home?.guard // nil: 아직 guard 설정되지 않음

// 경비원 설정
geuni?.home?.guard = superman
geuni?.home?.guard // Optional(Person): geuni의 home에 guard가 설정됨

// 경비원의 이름과 직업 확인
geuni?.home?.guard?.name // "superman": 경비원의 이름
geuni?.home?.guard?.job // nil: 경비원의 직업은 설정되지 않음

// 경비원의 직업 설정
geuni?.home?.guard?.job = "경비원"
geuni?.home?.guard?.job // "경비원": 직업 설정 완료

옵셔널 체이닝을 통해 중첩된 옵셔널 프로퍼티에 안전하게 접근하고, 값을 설정하거나 확인할 수 있습니다.


🍏 nil 병합 연산자

  • nil 병합 연산자 (??)는 옵셔널 값이 'nil'일 때 대체할 기본값을 제공하는 데 유용합니다.
var guardJob: String

// 옵셔널 체이닝 결과가 nil일 경우 기본값 "슈퍼맨"을 사용
guardJob = geuni?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 출력: "경비원" (geuni의 home.guard.job이 설정됨)

// 옵셔널 체이닝 결과가 nil일 경우 기본값 "슈퍼맨"을 사용
geuni?.home?.guard?.job = nil
guardJob = geuni?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 출력: "슈퍼맨" (geuni의 home.guard.job이 nil로 설정됨)

nil 병합 연산자는 옵셔널 값이 nil일 때 지정한 기본값을 사용하여 코드의 안정성을 높입니다. 옵셔널 체이닝과 함께 사용하면 더욱 효과적으로 옵셔널 값을 처리할 수 있습니다.

profile
꾸준히 기록하기

0개의 댓글