[Swift] 옵셔널 체인

민니·2022년 7월 14일
0

Swift 문법

목록 보기
13/17

옵셔널 체인 ❓

옵셔널 타입의 문제점

Swift에서 옵셔널 타입은 nil이 할당될 수 있는 값을 의미
옵셔널 타입을 사용할 때, if 구문을 통해 값의 안전성 여부를 검사하는 경우가 많음

➡️ 클래스나 구조체의 인스턴스가 옵셔널 타입으로 선언될 경우, 프로퍼티와 메서드를 호출할 때 매번 if 구문을 통해 인스턴스의 안정성 여부를 검사해야 한다

➡️ 코드가 복잡해짐 🥲

📚 Example

struct Human {
    var name: String?
    var man: Bool = true
}

var boy: Human? = Human(name: "홍길동", man: true)

✏️ Human 구조체를 인스턴스로 생성
✏️ 옵셔널 타입 변수 boy에 할당


📚 boy 인스턴스로부터 name 프로퍼티 참조하기

//boy 인스턴스로부터 name 프로퍼티를 참조하려면2
if let b = boy {
    if let name = b.name {
        print("이름은 \(name)입니다")
    }
}
//결과: 이름은 홍길동입니다

Human 구조체를 다른 구조체나 클래스가 프로퍼티로 사용하고,

이를 옵셔널 타입으로 설정했을 때,

name 프로퍼티를 참조하려면 ❓

struct Company {
    var ceo: Human?
    var companyName: String?
}

var startup: Company? = Company(ceo: Human(name: "김대표", man: false), companyName: "땡땡아카데미")

✏️ Company 구조체
Human 타입의 구조체 인스턴스를 옵셔널 타입으로 할당받는 ceo 프로퍼티 선언
ㄴ String을 입력받는 옵셔널 타입의 companyName 프로퍼티 선언
✏️ 변수 startUp에 옵셔널 타입으로 Company 구조체 할당


이제 name 프로퍼티를 참조해 보자!

if let company = startup {
    if let ceo = company.ceo {
        if let name = ceo.name {
            print("대표이사의 이름은 \(name)입니다")
        }
    }
}
//결과: 대표이사의 이름은 김대표입니다

➡️ 매번 if 구문을 중첩해서 작성하므로, 작성된 코드를 쉽게 파악하기 어려움 🥲


옵셔널 체인

  • 옵셔널 타입으로 정의된 값이 하위 프로퍼티나 메서드를 가지고 있을 때, if 구문을 사용하지 않고도 간결하게 사용할 수 있는 코드를 작성하기 위해 도입
  • ? 연산자를 사용하여 이어서 참조

참고!
옵셔널 체인의 기본 패러다임은 Objective-C의 특성 중 하나로부터 비롯됨
Objective-C 언어에서 nil인 객체에 메시지를 보내도 아무런 오류가 발생하지 않는다는 것!
(= 객체지향식으로 이야기하면, nil인 객체의 메서드나 프로퍼티를 호출하더라도 오류가 발생하지 않는다)
옵셔널 체인은 객체가 nil인 상황에서 안전성 검사를 하지 않고, 메서드나 프로퍼티를 호출하더라도 오류가 발생하지 않을 수 있는 문법을 옵셔널 스타일을 이용하여 구현함


앞서 중첩된 if 구문을 이용하여 name 프로퍼티를 참조하면 다음과 같다.

if let company = startup {
    if let ceo = company.ceo {
        if let name = ceo.name {
            print("대표이사의 이름은 \(name)입니다")
        }
    }
}
//결과: 대표이사의 이름은 김대표입니다

옵셔널 체인을 이용하여 참조하면, 코드가 훨씬 단순해진다!

if let name = startup?.ceo?.name {
    print("대표이사의 이름은 \(name)입니다")
}
//결과: 대표이사의 이름은 김대표입니다

옵셔널 체인의 특징

  1. 옵셔널 체인으로 참조된 값은 무조건 옵셔널 타입으로 반환됨
  2. 옵셔널 체인 과정에서 옵셔널 타입들이 여러 번 겹쳐 있더라도 중첩되지 않고 한번만 처리됨

하나하나씩 알아보자!

1. 옵셔널 체인으로 참조된 값은 무조건 옵셔널 타입으로 반환됨

  • 옵셔널 체인 구문에서 마지막에 오는 값이 옵셔널 타입이 아닌 일반 값이어도, 옵셔널 체인을 통해 참조했다면 옵셔널 타입으로 변경됨
struct Human {
    var name: String?
    var man: Bool = true
}

struct Company {
    var ceo: Human?
    var companyName: String?
}

var startup: Company? = Company(ceo: Human(name: "김대표", man: false), companyName: "땡땡아카데미")

print(startup?.ceo?.man) //Optional(false)

✏️ Human구조체의 man 프로퍼티는 일반 값이지만, 옵셔널 체인을 통해 참조되어 옵셔널 타입으로 변경되었음
✏️ 만약 단계적으로 옵셔널 타입을 해제하며 참조하였다면, 일반 타입으로 반환됨


2. 옵셔널 체인 과정에서 옵셔널 타입들이 여러 번 겹쳐 있더라도 중첩되지 않고 한번만 처리됨

Q. 옵셔널 체인이 여러 번 반복되면 그만큼 옵셔널 타입이 중첩되는 건 아닐까??????

Optional(Optional(Optional(123))) 이렇게!!!!!!!

A. 아님니다.

옵셔널 타입을 몇 번 중첩하더라도, 결국 반환할 수 있는 값은 nil 또는 정상값이므로 하나의 옵셔널 객체로 감싼 값일 뿐!

Optional(Optional(Optional(123)))은 그냥 Optional(123) 임 🥲




🔗
꼼꼼한 재은씨의 스위프트: 문법편

0개의 댓글