[Swift] Ch6. 흐름 제어

JJUDEV·2024년 2월 29일
0

Swift

목록 보기
9/21
post-thumbnail

본 글은 야곰의 스위프트 프로그래밍: Swift5 교재를 토대로 공부한 내용과 찾아본 내용을 요약한 것입니다.

6.1 조건문

1) if 구문

Swift에서 소괄호(())는 생략 가능하지만, 중괄호({})는 생략할 수 없습니다.

let first: Int = 5
let second: Int = 5
var biggerValue: Int = 0

if first > second { // 조건 수식 소괄호 X
	biggerValue = first
} else if (first == second) { // 조건 수식 소괄호
	biggerValue = second
}
// else 문은 없어도 됨

또한, Swift에서는 다른 언어와 달리 if 구문의 조건이 Bool 타입이어야 합니다. 아래에서 예시를 들어보겠습니다.

// swift 예시
let someValue = 1
// Swift에서는 아래와 같은 코드가 컴파일 에러를 발생시킵니다.
// if someValue { 
//     // Do something
// }

// 올바른 사용 예:
if someValue == 1 {
    // Do something
}
// C언어 예시
int a = 0;
if (a) {
    // 이 블록은 실행되지 않습니다. a가 0이기 때문입니다. 컴파일 에러가 나지 않는다.
} else {
    // 이 블록이 실행됩니다.
}

2) switch 구문

Swift의 switch 구문은 여러 가능한 케이스 중에서 하나를 선택하여 실행할 수 있도록 하는 조건문입니다. Swift의 switch 구문은 다른 프로그래밍 언어들과 비교했을 때 몇 가지 독특한 특징을 가지고 있습니다.

기본 구조
switch 구문은 특정 값을 여러 case 중 하나와 비교하여 해당하는 case의 코드 블록을 실행합니다. 모든 가능한 케이스를 처리해야 하며, 어떤 케이스에도 해당하지 않는 경우를 위해 default 케이스를 제공해야 합니다.

let someValue = 3

switch someValue {
case 1:
    print("값은 1입니다.")
case 2:
    print("값은 2입니다.")
case 3:
    print("값은 3입니다.")
default:
    print("값은 1, 2, 3 중에 하나가 아닙니다.")
}

열거형 예시

enum Season {
    case spring
    case summer
    case autumn
    case winter
}
let currentSeason = Season.autumn

switch currentSeason {
case .spring:
    print("꽃이 피는 계절입니다.")
case .summer:
    print("날씨가 더운 계절입니다.")
case .autumn:
    print("단풍이 지는 계절입니다.")
case .winter:
    print("눈이 오는 계절입니다.")
}

swift에서 swift 구문의 독특한 특징

1) 명시적인 break가 필요 없음: Swift에서는 case의 코드 블록을 실행한 후 자동으로 switch 구문을 빠져나갑니다. 따라서 다른 언어에서 필요한 break문을 쓰지 않아도 됩니다.

2) 범위 매칭: 값의 범위를 나타내는 case를 사용할 수 있습니다.

let someValue = 85

switch someValue {
case 0..<50:
    print("값은 50 미만입니다.")
case 50..<100:
    print("값은 50 이상 100 미만입니다.")
default:
    print("값은 100 이상입니다.")
}

3) 튜플 매칭: 튜플을 사용하여 여러 값에 대한 매칭을 동시에 수행할 수 있습니다.

let somePoint = (1, 1)

switch somePoint {
case (0, 0):
    print("(0, 0)은 원점입니다.")
case (_, 0):
    print("x축에 있습니다.")
case (0, _):
    print("y축에 있습니다.")
case (-2...2, -2...2):
    print("(-2, -2)와 (2, 2) 사이에 있습니다.")
default:
    print("상자 밖에 있습니다.")
}

4) 값 바인딩: case 내에서 매치된 값의 일부 또는 전체를 임시 상수나 변수로 바인딩할 수 있습니다.

let anotherPoint = (2, 0)

switch anotherPoint {
case (let x, 0):
    print("x축에 있으며, x의 값은 \(x)입니다.")
case (0, let y):
    print("y축에 있으며, y의 값은 \(y)입니다.")
case let (x, y):
    print("어딘가에 있으며, 그 위치는 (\(x), \(y))입니다.")
}

5) Where 절: case 패턴에 추가 조건을 명시할 수 있습니다.

let yetAnotherPoint = (1, -1)

switch yetAnotherPoint {
case let (x, y) where x == y:
    print("x와 y가 같습니다.")
case let (x, y) where x == -y:
    print("x와 y가 대칭적입니다.")
case let (x, y):
    print("(\(x), \(y))")
}

Swift의 switch 구문은 이러한 특징 덕분에 매우 강력하고 유연한 조건 처리를 가능하게 합니다.

6.2 반복문

swift의 반복문은 기존 프로그래밍 언어의 반복문과 크게 다르지 않습니다만, 정통적인 C 스타일의 for 구문이 사라졌다는 것과 조건에 괄호를 생략할 수 있습니다. 또한, do-while 구문은 swift에선 repeat-while 구문으로 구현되어 있습니다.

1) for-in 구문

아래 예시에서 C언어 스타일의 swift 초기 버전의 for 구문과 현재 swift의 for 구문 예시를 들어보겠습니다.

// Swift 초기 버전의 for 구문
// C 언어와 유사하게 초기 조건, 종료 조건, 그리고 반복마다 실행되는 표현식을 세미콜론으로 구분
for var i = 0; i < 10; i++ {
    print(i)
}

// 현재 Swift의 for 구문
for i in 0..<10 {
    print(i)
}

2) while 구문

while 구문도 다른 프로그래밍 언어의 while 구문과 크게 다르지 않습니다. for-in 구문과 마찬가지로 continue, break 등의 제어 키워드 사용이 가능합니다.

var names: [String] = ["Joker", "Jenny", "Nova", "Juhyun"]

while names.isEmpty == false {
	print("Good bye \(names.removeFirst())"
    // removeFirst()는 요소를 삭제함과 동시에 삭제한 요소를 반환
}
// Good bye Joker
// Good bye Jenny
// Good bye Nova
// good bye Juhyun

4) repeat-while 구문

Swift의 repeat-while 반복문은 다른 언어의 do-while 반복문과 유사합니다. 이 구조는 먼저 코드 블록을 실행한 다음, 조건을 평가하여 해당 조건이 true인 동안 코드 블록을 반복 실행합니다. 이는 적어도 한 번은 코드 블록이 실행됨을 보장합니다.

var number = 1

repeat {
    print(number)
    number += 1
} while number <= 5
// 1
// 2
// 3
// 4
// 5

6.3 구문 이름표

Swift에서 구문 이름표(statement label)는 특히 중첩된 루프(loop)나 조건문에서 특정 구문을 명시적으로 식별할 때 유용합니다. 구문 이름표를 사용하면 반복문이나 조건문 안에서 다른 반복문이나 조건문으로 제어를 전달할 때, 어떤 구문에 대한 제어를 전달할지 명확하게 지정할 수 있습니다. 이는 break와 continue 키워드와 함께 사용됩니다.
구문 이름표는 다음과 같이 정의됩니다.

labelName: while condition {
    statements
}

break와 continue와의 사용

  • break labelName: 지정된 레이블 이름을 가진 반복문이나 조건문을 종료합니다.
  • continue labelName: 다음 반복으로 제어를 이동시키되, 지정된 레이블 이름을 가진 반복문의 다음 반복으로 제어를 이동시킵니다.
outerLoop: for i in 1...3 {
    innerLoop: for j in 1...3 {
        if i == 2 && j == 2 {
            break outerLoop
        }
        print("i: \(i), j: \(j)")
    }
}
// i: 2, j: 2

구문 이름표를 사용하면 복잡한 중첩 구조에서도 제어 흐름을 명확하게 관리할 수 있습니다. 이는 코드의 가독성과 유지 보수성을 향상시키는 데 도움이 됩니다.

참고자료

  • 스위프트 프로그래밍 3판(지은이: 야곰, 출판사: 한빛미디어(주))
  • ChatGPT 4
profile
4년차 앱개발자입니다.

0개의 댓글