🔥 제어 흐름

670자
7분

Swift에서는 조건문과 반복문을 사용하여 코드의 실행 흐름을 제어할 수 있어요. 조건문에는 ifswitch가 있고, 반복문에는 for-in, while, repeat-while이 있답니다. 조건이나 반복 변수를 둘러싼 괄호는 선택 사항이지만, 본문을 둘러싼 중괄호는 필수랍니다.

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        // 점수가 50점 초과이면 팀 점수에 3점 추가
        teamScore += 3
    } else {
        // 50점 이하이면 팀 점수에 1점 추가
        teamScore += 1
    }
}
print(teamScore)
// 출력 결과: "11"
swift

if 문에서 조건은 반드시 Boolean 표현식이어야 해요. 따라서 if score { ... }와 같은 코드는 0과의 암시적 비교가 아닌 오류랍니다.

ifswitch를 대입 연산자(=) 뒤에 쓰거나 return 뒤에 써서 조건에 따라 값을 선택할 수도 있어요.

let scoreDecoration = if teamScore > 10 {
    // 팀 점수가 10점 초과이면 🎉 이모지 사용
    "🎉"
} else {
    // 10점 이하이면 빈 문자열 사용
    ""
}
print("Score:", teamScore, scoreDecoration)
// 출력 결과: "Score: 11 🎉"
swift

iflet을 함께 사용하여 없을 수도 있는 값(옵셔널)을 다룰 수 있어요. 옵셔널 값은 값을 담고 있거나, 값이 없음을 나타내는 nil을 담고 있지요. 값의 타입 뒤에 물음표(?)를 붙여 해당 값이 옵셔널임을 표시해요.

var optionalString: String? = "Hello"
print(optionalString == nil)
// 출력 결과: "false"
 
 
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    // optionalName에 값이 있다면 name 상수에 할당하고 인사말을 만듦
    greeting = "Hello, \(name)"
}
swift

옵셔널 값이 nil이면 조건은 false가 되고 중괄호 안의 코드는 건너뛰게 돼요. 그렇지 않으면 옵셔널 값이 언래핑되어 let 뒤의 상수에 할당되고, 이 언래핑된 값은 코드 블록 내에서 사용할 수 있답니다.

옵셔널 값을 다루는 또 다른 방법은 ?? 연산자를 사용하여 기본값을 제공하는 거예요. 옵셔널 값이 없으면 기본값이 대신 사용된답니다.

let nickname: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickname ?? fullName)"
swift

값을 언래핑할 때 더 짧은 표기법을 사용할 수도 있어요. 언래핑된 값에 같은 이름을 사용하는 거죠.

if let nickname {
    print("Hey, \(nickname)")
}
// nickname이 nil이므로 아무것도 출력되지 않음
swift

스위치문은 다양한 종류의 데이터와 광범위한 비교 연산을 지원해요. 정수와 동등성 검사에만 국한되지 않지요.

let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")
default:
    print("Everything tastes good in soup.")
}
// 출력 결과: "Is it a spicy red pepper?"
 
swift

let을 패턴에서 사용하여 패턴과 일치하는 값을 상수에 할당할 수 있다는 점에 주목하세요.

매칭된 switch case 내부의 코드를 실행한 후에는 switch 문을 빠져나가게 돼요. 다음 case로 실행이 계속되지 않으므로 각 case 코드의 끝에서 명시적으로 break 할 필요가 없답니다.

딕셔너리의 항목을 반복하려면 for-in을 사용하고 각 키-값 쌍에 사용할 한 쌍의 이름을 제공하면 돼요. 딕셔너리는 순서가 없는 컬렉션이므로 키와 값은 임의의 순서로 반복된답니다.

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (_, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
print(largest)
// 출력 결과: "25"
swift

while을 사용하면 조건이 변경될 때까지 코드 블록을 반복할 수 있어요. 반복문의 조건을 끝에 둘 수도 있는데, 이렇게 하면 반복문이 최소한 한 번은 실행된답니다.

var n = 2
while n < 100 {
    n *= 2
}
print(n)
// 출력 결과: "128"
 
 
var m = 2
repeat {
    m *= 2
} while m < 100
print(m)
// 출력 결과: "128"
swift

..<를 사용하여 인덱스의 범위를 만들면 반복문에서 인덱스를 유지할 수 있어요.

var total = 0
for i in 0..<4 {
    total += i
}
print(total)
// 출력 결과: "6"
swift

상한값을 제외하는 범위를 만들려면 ..<를, 양쪽 값을 모두 포함하는 범위를 만들려면 ...를 사용하세요.

이렇게 Swift에서는 다양한 제어문과 반복문을 활용하여 코드의 실행 흐름을 효과적으로 제어할 수 있답니다. 조건에 따른 분기와 반복을 통해 원하는 로직을 구현할 수 있죠. 또한 옵셔널 값을 안전하게 다루기 위한 방법도 제공하고 있어요. 이러한 기능들을 잘 활용한다면 더욱 강력하고 유연한 Swift 코드를 작성할 수 있습니다.