[iOS] 패스트캠퍼스 챌린지 11일차 - Optional(2)
Optional의 해제
Optional은 그자체로 값이 아니다. 비유하자면 택배박스와 같은데, 택배박스를 개봉해야 내용물이 나오는 것처럼 Optional도 값을 가져오기 위해서는 Optional 해제를 해야한다.
Optional 해제는 4가지 방법이 있다.
- Forced unwrapping
- Optional binding (if let)
- Optional binding (guard)
- Nil coalescing
하나하나 알아보자
Forced unwrapping
'Forced'란 말에서 느껴지겠지만 말 그래도 강제로 Optional을 해제한다는 말이다. 억지로 택배박스를 까는 것이다!
강제로 Optional을 해제한다는 건 무슨 소리일까?
var carName: String?
carName = nil
carName = "Avante"
print(carName) // 결과: Optional("Avante")
print(carName!) // 결과: Avante
Optional은 박스라고 했다. 따라서 박스인 상태의 Optional을 그대로 print 하면 Optional("값")이 출력된다.
값을 print하기 위해서는 박스를 까야하는데, 값은 '!' 기호를 사용하여 해제할 수 있다.
Optional 타입의 변수에 !를 붙이면 뭐가 되든 optional이 해제된다.
이때 주의해야할 것이 있다. 값이 nil인 optional 타입의 변수를 강제로 해제하게 되면 Fatal error가 발생하므로 주의해야한다.
Optional binding(if let)
Forced unwrapping은 optional이 nil이든 아니든 optional을 해제하는 것이라고 했다. 이때 optional의 값이 nil인 상태에서 해제를 하게 되면 fatal error가 발생한다. Optional binding(if let)은 nil인 상태의 optional이 해제되어 에러가 발생하는 상황을 방지하기 위한 해제 기법이다.
if let unwrappedCarName = carName {
print(unwrappedCarName)
} else {
print("car name 없다")
}
if let unwrappedCarName = carName 은 carName이란 optional 타입이 성공적으로 해제되면 print(unwrappedCarName)을 실행하고, 만약 optional 해제에 실패하였으면 print("car name 없다")를 출력하는 구문이다.
Optional binding(guard)
Optional binding(if let)은 optional 해제 결과에 따라 if~else 구문으로 분기된다. 만약 if~else 구문 안에서 또 로직을 분기해야 한다면, 코드의 레벨 , 즉 복잡도가 올라가게 된다. 이런 코드는 유지보수 관점에서 매우 좋지 않은 코드이다. 따라서 복잡도를 줄이는 게 필요하다
Optional binding(guard)는 코드의 복잡도를 줄이기 위한 것이다.
// string 타입의 정수값을 받아서 Int로 Parsing이 성공하면 Int로 컨버팅, 아니면 예외 출력
func printParsedInt(from: String){
if let parsedInt = Int(from) {
print(parsedInt)
// Cyclomatic Complexity - 코드의 복잡도를 측정 .복잡하면 해당 값이 올라가는데 너무 높으면 코드를 리팩토링 해야한다
} else{
print("Int로 컨버팅 안된다.")
}
}
// guard 방식으로 optional 해제
func printParsedInt(from: String){
guard let parsedInt = Int(from) else{
print("Int로 컨버팅 안된다.")
return
}
print(parsedInt)
}
이 두개의 코드는 같은 코드이다. 단지 어떤 방식으로 optional을 해제했냐의 차이이다. 아래의 guard를 살펴보자.
예제의 guard는 optional 해제 성공 시 바로 print(parsedInt)를 수행한다. 하지만 실패시 else {} 구문을 수행한다.
optional binding(if let)과 비교해 본다면, 코드의 깊이가 낮음을 알 수 있다.
Nil Coalescing
Nil Coalescing은 optional 해제시 값이 nil일 때 default 값을 주는 것이다.
let myCarName: String = carName ?? "SONATA"
myCarName은 Optional이 아닌 String 타입이고, 이때 초기값을 carName의 값으로 설정한다. 만약 carName의 값이 nil이라면 "SONATA"로 mycarName을 설정한다.

패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.