핵심 한 줄
- `guard let`: 실패 조건을 먼저 걸러내고, 성공 경로를 계속 이어갈 때 사용한다.
- `if let`: 값이 있을 때만 짧은 분기 로직을 실행할 때 사용한다.
- 중요한 기준은 문법 취향이 아니라 "이후 코드의 가독성"이다.
둘 다 optional binding이지만, 코드의 의도를 표현하는 방식이 다르다. 이 문서는 "어느 문법이 맞냐"보다 "어떤 흐름에서 어떤 문법이 읽기 쉬운가"를 기준으로 정리한다.
2026-04-17
optional을 해제하는 시점이 많아질수록 함수가 분기문으로 뒤엉키기 쉽다. 이때 `guard let`으로 선조건을 정리하면 주 로직이 왼쪽 정렬로 남고, `if let`은 필요한 구간에서만 국소적으로 쓰게 되어 코드 의도가 명확해진다.
func loadProfile(userID: String?) {
guard let userID else {
logger.warn("missing user id")
return
}
// 여기부터는 userID가 반드시 존재한다고 가정 가능
requestProfile(userID: userID)
}
func renderNickname(_ nickname: String?) {
if let nickname {
nameLabel.text = nickname
} else {
nameLabel.text = "-"
}
}함수의 "계속 진행 조건"을 확정해야 하면 `guard let`, "특정 블록에서만" 값이 필요하면 `if let`이 더 자연스럽다.
둘 중 하나만 팀 규칙으로 강제하면 안 되나요?
권장 규칙은 만들 수 있지만, 둘의 쓰임새가 다르기 때문에 단일 문법 강제는 오히려 가독성을 해칠 수 있다. 핵심은 "주 흐름 보존"과 "분기 범위 최소화"다.
`guard let`을 쓰면 무조건 좋은 건가요?
아니다. 아주 짧은 UI 분기에도 `guard`를 남용하면 함수가 조기 종료 포인트로 흩어져 오히려 읽기 어려워질 수 있다. 조건의 성격에 맞춰 선택해야 한다.