옵셔널 체이닝은 옵셔널에 속해 있는 nil일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정입니다.

옵셔널에 값이 있다면 프로퍼티, 메서드, 서브스크립트 등을 호출할 수 있고, 옵셔널이 nil이라면 프로퍼티, 메서드, 서브스크립트 등은 nil을 반환합니다.

즉, 옵셔널을 반복 사용하여 옵셔널이 자전거 체인처럼 서로 꼬리를 물고 있는 모양이기 때문에 옵셔널 체이닝이라고 부릅니다.

자전거 체인에서 한 칸이라도 없거나 고장 나면 체인 전체가 동작하지 않듯이 중첩된 옵셔널 중 하나라도 값이 존재하지 않는다면 결과적으로 nil을 반환합니다.

옵셔널 체이닝은 프로퍼티나 메서드 또는 서브스크립트를 호출하고 싶은 옵셔널 변수나 상수 뒤에 물음표(?)를 붙여 표현합니다.

옵셔널이 nil이 아니라면 정상적으로 호출될 것이고, nil이라면 결괏값으로 nil을 반환할 것입니다.

결과적으로 nil이 반환될 가능성이 있으므로 옵셔널 체이닝의 반환된 값은 항상 옵셔널입니다.

<aside> 📖 NOTE _ 느낌표(!)

물음표 대신에 느낌표(!)를 사용할 수도 있는데 이는 옵셔널에서 값을 강제 추출하는 효과가 있습니다. 물음표를 사용하는 것과 가장 큰 차이점은 값을 강제 추출하기 때문에 옵셔널에 값이 없다면 런타임 오류가 발생한다는 점입니다. 또 다른 점은 옵셔널에서 값을 강제 추출해 반환하기 때문에 반환 값이 옵셔널이 아니라는점 입니다. 하지만 정말 100% nil이 아니라는 확신을 하더라도 사용을 지양하는 편이 좋습니다.

</aside>

옵셔널 체이닐에 대해 알아보기 위해 아래의 코드에서 기본 클래스를 설계하겠습니다.

/// 사람의 주소 정보 표현 설계

class Room { // 호실
	var number: Int // 호실 번호

	init(number: Int) {
		self.number = number
	}
}

class Building { // 건물
	var name: String // 건물 이름
	var room: Room? // 호실 정보
	
	init(name: String) {
		self.name = name
	}
}

struct Address { // 주소
	var province: String // 광역시/도
	var city: String // 시/군/구
	var street: String // 도로명
	var building: Building? // 건물
	var detailAddress: String? // 건물 외 상세 주소
}

class Person { // 사람
	var name: String // 이름
	var address: Address? // 주소

	init(name: String) {
		self.name = name
	}
}