본문 바로가기
swift

스위프트 옵셔널 체인

by 승환파크 2024. 4. 16.

옵셔널은 if 구문을 통해 안정성 여부를 검사하고 사용한다. 이 때문에 코드가 길어진다. 클래스나 구조체는 프로퍼티나 메소드를 소유하는데, 이 때 클래스나 구조체의 인스턴스가 옵셔널 타입으로 선언될 경우 프로퍼티와 메소드를 호출하기 위해 매번 if 구문을 통해 정상값 여부를 검사해야 한다.

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

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

 

boy가 Human? 타입이므로 name 옵셔널 프로퍼티를 참조하려면 안전성 검사가 필요하다.

if boy != nil {
    if boy!.name != nil {
        print("이름은 \(boy!.name!)입니다.")
    }
}

// 혹은

if let b = boy {
    if let name = b.name {
        print("이름은 \(name)입니다.")
    }
}

 

이처럼 안전성을 담보하려면 if 구문의 처리를 피할 수 없다. 앱을 만들 때 이처럼 옵셔널 타입을 중첩해서 사용하는 경우가 많다. 매번 if를 작성하는 것은 상당한 부담이며 쓸데없이 코드도 길어진다. 이러한 옵셔널의 치명적인 단점을 극복하고 복잡한 코드를 간단하게 줄여주는 것이 바로 옵셔널 체인이다.

 

옵셔널 체인

옵셔널 체인은 옵셔널 타입으로 정의된 값이 하위 프로퍼티나 메소드를 가지고 있을 때, 이 요소들을 if 구문을 쓰지 않고도 간결하게 사용할 수 있는 코드를 작성하기 위해 도입되었다. 옵셔널 체인은 객체가 nil인 상황에서 안전성 검사를 하지 않고 메소드나 프로퍼티를 호출하더라도 오류가 발생하지 않을 수 있는 문법을 옵셔널 스타일을 이용하여 구현한다. 앞선 예시에서 boy 변수 하위의 name 변수를 호출할 때는 아래와 같이 사용하면 된다.

boy?.name

 

설령 boy 변수에 nil이 할당되어 있더라도 잘못된 참조에 의한 오류는 발생하지 않고 아무 일도 일어나지 않는다. 옵셔널 체인의 마지막 값 자체는 옵셔널 체인에 해당하지 않는다. 옵셔널 체인으로 처리할 수 있는 것은 하위 속성이나 메소드를 호출할 때이다. 만약 값을 참조하는 것이 아니라 할당할 때는 다음과 같이 간편하게 작성할 수 있다.

boy?.name = "Peter"

 

일반적으로 옵셔널 체인에는 다음과 같은 특징이 있다.

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

1번에서 옵셔널 체인 구문에서 마지막에 오는 값이 옵셔널이 아닌 일반 값일지라도 옵셔널 체인을 통해 참조했다면 이 값은 옵셔널 타입으로 변경된다.

print(boy?.man)
// Optional(true)

 

man 프로퍼티는 옵셔널이 아닌 Bool 타입이지만 결과는 옵셔널 타입으로 확인된다. 반드시 옵셔널 타입으로 반환되는 이유는 옵셔널 체인이라는 구문 자체가 nil을 반환할 가능성을 내포하고 있기 때문이다.

'swift' 카테고리의 다른 글

스위프트 IBAction 및 IBOutlet  (1) 2024.04.19
스위프트 Interface Builder 와 UI 구성  (0) 2024.04.19
스위프트 초기화 구문  (1) 2024.04.16
스위프트 타입 캐스팅  (1) 2024.04.16
스위프트 상속  (1) 2024.04.16