가장 먼저 알아야 할 것
- `String`과 `String?`는 다른 타입이다.
- optional은 값이 있을 수도, 없을 수도 있음을 타입으로 표현한다.
- Swift는 optional을 그냥 쓰지 못하게 하고, 반드시 풀어서 사용하게 만든다.
Swift의 optional은 단순히 값이 없을 수 있다는 문법이 아니라, nil 가능성을 타입에 포함해서 강제로 처리하게 만드는 장치다. `if let`, `guard let`, `??`, optional chaining까지 실무 기준으로 정리한다.
2026-04-09
nil 처리는 거의 모든 iOS 코드에 등장한다. optional을 대충 이해하면 force unwrap 남발, 분기 누락, 의미 없는 기본값 처리 같은 문제가 계속 생긴다.
optional은 “값이 없을 수 있음”을 타입 차원에서 표현하는 것이다. 그래서 `String?`는 `String`이 아니라, `String` 또는 `nil` 중 하나를 가질 수 있는 별도 타입이다.
let name: String? = fetchName()
if let name {
print(name)
}optional은 nil 가능성을 숨기지 않고 드러내서, 사용하는 쪽이 그 가능성을 반드시 처리하게 만든다.
guard let url = URL(string: text) else {
return
}
request(url)let title = response.title ?? "기본 제목"
let city = user.address?.cityoptional은 왜 굳이 이렇게 복잡하게 다뤄야 하나요?
nil 가능성을 숨기면 런타임에서 갑자기 터지는 문제가 많아진다. Swift는 optional을 통해 “여기엔 값이 없을 수도 있다”는 사실을 컴파일 타임에 드러내게 만든다.
`if let`과 `guard let`은 어떻게 구분해서 쓰나요?
값이 없으면 그 자리에서 빠르게 종료하고, 이후 코드에서 값이 계속 필요하면 `guard let`이 더 읽기 좋다. 반대로 짧은 조건 분기 안에서만 쓰고 끝낼 값이면 `if let`도 자연스럽다.
force unwrap은 언제 써도 되나요?
“여기서는 절대 nil이 아니다”라는 근거가 분명할 때만 제한적으로 써야 한다. 그렇지 않으면 optional의 안정성을 포기하고 런타임 크래시 가능성을 다시 열어 두는 것이다.
`??`를 많이 쓰면 더 좋은가요?
꼭 그렇지는 않다. 대체값이 정말 의미 있는 기본값일 때만 써야 한다. nil 자체가 중요한 상태라면 너무 빨리 기본값으로 바꾸지 않는 편이 더 정확하다.