🤖 이 글은 Claude Code(AI)가 작성합니다. | 시리즈 목차 | 이전: 3편
제어 흐름은 어떤 언어에서나 비슷해 보입니다. if로 분기하고, 반복문으로 돌리고. 하지만 Swift에는 다른 언어와 확연히 다른 두 가지가 있습니다. switch의 작동 방식과 guard라는 키워드입니다. 이 두 가지를 중심으로 Swift의 제어 흐름을 살펴봅니다.
if / else if / else
기본 구조는 다른 언어와 같습니다. 한 가지 차이는 조건식을 괄호로 감쌀 필요가 없다는 것입니다(감싸도 되지만 Swift 관례는 생략).
let temperature = 22
if temperature > 30 {
print("덥다")
} else if temperature > 20 {
print("쾌적하다")
} else {
print("춥다")
}
// 쾌적하다
Swift의 if는 반드시 Bool 조건만 받습니다. 2편에서 언급했듯 0이나 빈 문자열 같은 “거짓 같은 값(falsy)”을 암묵적으로 처리하지 않습니다.
let count = 0
if count { // 오류: Bool이 아님
print("empty")
}
if count == 0 { // 올바른 방식
print("empty")
}
switch — fallthrough 없는 패턴 매칭
Swift의 switch는 C, Java, JavaScript의 것과 크게 다릅니다. 차이점을 먼저 나열하면:
- fallthrough가 기본적으로 없다 — 각
case가 끝나면 자동으로switch를 빠져나온다 - 모든 경우를 반드시 처리해야 한다 —
default로 나머지를 처리하거나, 가능한 모든 케이스를 명시해야 한다 - 패턴 매칭을 지원한다 — 단순 값 비교를 넘어 범위, 튜플, 타입까지 매칭할 수 있다
let score = 85
switch score {
case 90...100:
print("A")
case 80..<90:
print("B")
case 70..<80:
print("C")
default:
print("F")
}
// B
90...100은 90 이상 100 이하(닫힌 범위), 80..<90은 80 이상 90 미만(반열린 범위)입니다.
여러 값을 한 케이스에 묶을 수 있습니다.
let day = "토"
switch day {
case "토", "일":
print("주말")
case "월", "화", "수", "목", "금":
print("평일")
default:
print("알 수 없음")
}
where로 추가 조건을 붙일 수도 있습니다.
let point = (3, -2)
switch point {
case (0, 0):
print("원점")
case (let x, 0):
print("x축 위: \(x)")
case (0, let y):
print("y축 위: \(y)")
case (let x, let y) where x == y:
print("y=x 선 위")
case (let x, let y):
print("(\(x), \(y))")
}
// (3, -2)
C 언어 스타일처럼 의도적으로 다음 케이스로 흘러가게 하고 싶다면 fallthrough 키워드를 명시적으로 씁니다. 하지만 실제로 쓸 일은 거의 없습니다.
for-in
3편에서 컬렉션 순회에 썼던 것과 같습니다. 숫자 범위에도 쓸 수 있습니다.
for i in 1...5 {
print(i) // 1, 2, 3, 4, 5
}
for i in 1..<5 {
print(i) // 1, 2, 3, 4
}
반복 변수가 필요 없을 때는 _로 무시합니다.
for _ in 1...3 {
print("반복")
}
stride로 증감 폭을 지정할 수 있습니다.
for i in stride(from: 0, to: 10, by: 2) {
print(i) // 0, 2, 4, 6, 8
}
while / repeat-while
조건이 참인 동안 반복합니다.
var n = 1
while n < 100 {
n *= 2
}
print(n) // 128
repeat-while은 본문을 최소 한 번 실행하고 조건을 확인합니다. Python의 while True: ... if ...: break 패턴이나 C의 do-while에 해당합니다.
var input = 0
repeat {
input += 1
} while input < 3
print(input) // 3
guard — 조기 탈출 패턴
guard는 Swift에서만 볼 수 있는 키워드입니다. if의 반대 방향으로 동작한다고 생각하면 됩니다.
if는 “조건이 참이면 실행한다”이고, guard는 “조건이 거짓이면 지금 블록에서 탈출한다”입니다.
func greet(name: String?) {
guard let name = name else {
print("이름이 없습니다")
return // 반드시 탈출해야 함
}
// 여기서부터 name은 String (옵셔널 아님)
print("안녕하세요, \(name)!")
}
greet(name: "철수") // 안녕하세요, 철수!
greet(name: nil) // 이름이 없습니다
guard가 왜 존재하는지는 if let과 비교하면 분명해집니다.
// if let 방식 — 유효한 경우가 중첩 안으로 들어감
func process(value: String?) {
if let v = value {
if v.count > 0 {
if let n = Int(v) {
print("숫자: \(n)")
}
}
}
}
// guard 방식 — 실패 케이스를 먼저 처리하고, 정상 흐름은 들여쓰기 없이 이어짐
func process(value: String?) {
guard let v = value else { return }
guard v.count > 0 else { return }
guard let n = Int(v) else { return }
print("숫자: \(n)")
}
두 번째 방식이 훨씬 읽기 쉽습니다. “이 조건을 만족하지 않으면 여기서 끝낸다”는 예외 케이스를 함수 앞쪽에서 정리하고, 정상 경로는 들여쓰기 없이 선형으로 이어집니다. 이것을 조기 탈출(early return) 패턴이라고 합니다.
guard는 반드시 return, throw, break, continue 중 하나로 현재 스코프를 탈출해야 합니다. 탈출 코드가 없으면 컴파일 오류가 납니다.
break와 continue
// break: 반복문 즉시 종료
for i in 1...10 {
if i == 5 { break }
print(i) // 1, 2, 3, 4
}
// continue: 현재 순회 건너뛰기
for i in 1...10 {
if i % 2 == 0 { continue }
print(i) // 1, 3, 5, 7, 9
}
중첩 반복문에서 바깥 반복문을 제어할 때는 레이블을 씁니다.
outer: for i in 1...3 {
for j in 1...3 {
if j == 2 { continue outer } // 안쪽 반복 건너뛰고 바깥 다음 순회로
print("\(i)-\(j)")
}
}
// 1-1, 2-1, 3-1
다른 언어와 비교
| Python | JavaScript / C | Swift | |
|---|---|---|---|
| if 조건 괄호 | 불필요 | 필수 | 불필요 (관례) |
| switch fallthrough | 없음 (match) | 기본 동작 | 없음 (명시 시만) |
| switch 망라성 | – | 불필요 | 모든 경우 처리 필수 |
| do-while | 없음 | 있음 | repeat-while |
| 조기 탈출 키워드 | 없음 | 없음 | guard |
핵심 요약
- Swift의
if는 반드시Bool조건을 받는다. 암묵적 truthy/falsy 없음. switch는 기본적으로 fallthrough가 없다. 범위, 튜플,where조건으로 강력한 패턴 매칭이 가능하다.guard는 조건이 거짓일 때 현재 스코프를 탈출한다. 예외 케이스를 먼저 처리하고 정상 흐름을 선형으로 유지하는 패턴이다.for-in은 컬렉션과 범위 모두에 쓸 수 있다.stride로 증감 폭을 지정할 수 있다.- 반복 변수가 필요 없을 때는
_로 무시한다.
다음 편은 5편 — 함수: 파라미터 레이블, 기본값, inout입니다. Swift 함수가 외부 이름과 내부 이름을 따로 갖는 이유와, 함수가 일급 시민이라는 것의 의미를 다룹니다.
🤖 Generated with Claude Code