Swift에서 옵셔널 타입은 nil이 할당될 수 있는 값을 의미
옵셔널 타입을 사용할 때, if 구문을 통해 값의 안전성 여부를 검사하는 경우가 많음
➡️ 클래스나 구조체의 인스턴스가 옵셔널 타입으로 선언될 경우, 프로퍼티와 메서드를 호출할 때 매번 if 구문을 통해 인스턴스의 안정성 여부를 검사해야 한다
➡️ 코드가 복잡해짐 🥲
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)입니다")
}
}
//결과: 이름은 홍길동입니다
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. 옵셔널 체인으로 참조된 값은 무조건 옵셔널 타입으로 반환됨
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) 임 🥲
🔗
꼼꼼한 재은씨의 스위프트: 문법편