iOS Development Guide

optional과 nil 처리 방식

Swift의 optional은 단순히 값이 없을 수 있다는 문법이 아니라, nil 가능성을 타입에 포함해서 강제로 처리하게 만드는 장치다. `if let`, `guard let`, `??`, optional chaining까지 실무 기준으로 정리한다.

Swift core type system Practical usage focus Knowledge item #5
학습 날짜

2026-04-09

가장 먼저 알아야 할 것

  • `String`과 `String?`는 다른 타입이다.
  • optional은 값이 있을 수도, 없을 수도 있음을 타입으로 표현한다.
  • Swift는 optional을 그냥 쓰지 못하게 하고, 반드시 풀어서 사용하게 만든다.

Why This Work Exists

nil 처리는 거의 모든 iOS 코드에 등장한다. optional을 대충 이해하면 force unwrap 남발, 분기 누락, 의미 없는 기본값 처리 같은 문제가 계속 생긴다.

핵심 설명

optional은 “값이 없을 수 있음”을 타입 차원에서 표현하는 것이다. 그래서 `String?`는 `String`이 아니라, `String` 또는 `nil` 중 하나를 가질 수 있는 별도 타입이다.

let name: String? = fetchName()

if let name {
    print(name)
}
핵심 요약

optional은 nil 가능성을 숨기지 않고 드러내서, 사용하는 쪽이 그 가능성을 반드시 처리하게 만든다.

`if let`과 `guard let`

  • `if let`은 조건부 분기 안에서만 값이 필요할 때 자연스럽다.
  • `guard let`은 이후 코드 전체에서 값이 반드시 필요할 때 더 읽기 좋다.
guard let url = URL(string: text) else {
    return
}

request(url)

`??`와 optional chaining

  • `??`는 nil일 때 대체값을 줄 때 쓴다.
  • `?.`는 중간 값이 nil이면 전체 결과를 nil로 흘려보낸다.
let title = response.title ?? "기본 제목"
let city = user.address?.city

실무 포인트

Then 1

optional은 왜 굳이 이렇게 복잡하게 다뤄야 하나요?

nil 가능성을 숨기면 런타임에서 갑자기 터지는 문제가 많아진다. Swift는 optional을 통해 “여기엔 값이 없을 수도 있다”는 사실을 컴파일 타임에 드러내게 만든다.

Then 2

`if let`과 `guard let`은 어떻게 구분해서 쓰나요?

값이 없으면 그 자리에서 빠르게 종료하고, 이후 코드에서 값이 계속 필요하면 `guard let`이 더 읽기 좋다. 반대로 짧은 조건 분기 안에서만 쓰고 끝낼 값이면 `if let`도 자연스럽다.

Then 3

force unwrap은 언제 써도 되나요?

“여기서는 절대 nil이 아니다”라는 근거가 분명할 때만 제한적으로 써야 한다. 그렇지 않으면 optional의 안정성을 포기하고 런타임 크래시 가능성을 다시 열어 두는 것이다.

Then 4

`??`를 많이 쓰면 더 좋은가요?

꼭 그렇지는 않다. 대체값이 정말 의미 있는 기본값일 때만 써야 한다. nil 자체가 중요한 상태라면 너무 빨리 기본값으로 바꾸지 않는 편이 더 정확하다.