[스위프트 프로그래밍-6장] 흐름 제어

sanghee·2021년 9월 26일
0
post-thumbnail

이 글은 스위프트 프로그래밍(3판, 야곰 지음)을 읽고 간단하게 정리한 글입니다. 책에 친절한 설명과 관련 예제 코드들이 있으므로 직접 사서 읽기를 추천합니다.

6.0 소개

  • 조건문: 특정 조건에서 코드를 실행하거나 실행하지 않는다.
  • 반복문: 특정 명령어를 반복해서 실행한다.

6.1 조건문

스위프트의 조건문에는 if 구문, switch 구문, guard 구문이 있다. guard 구문은 14장에서 다룰 예정이다.

6.1.1 if 구문

if와 else 키워드를 사용하여 구현한다. 스위프트의 if 구문은 조건의 값이 Bool 타입이어야만 한다. else if는 없거나 중복해 사용할 수 있으며 else 블록은 없어거나 한번 사용한다. 조건 수식을 소괄호로 묶어주는 것은 선택이다.

let a = 1
let b = 2

if a > b {
    print("a가 b보다 큽니다")
} else if a == b {
    print("a와 b가 같습니다")
} else {
    print("a가 b보다 작습니다")
} // a가 b보다 작습니다

6.1.2 switch 구문

switch 구문도 소괄호를 생략할 수 있다. break 키워드는 선택 사항이다. case를 연속 실행하려면 fallthrough를 사용한다. case에 들어갈 비교 값은 입력 값과 데이터 타입이 같아야 한다. 비교될 값이 명확히 한정적인 값(열거형 값 등)이 아닐 때이는 default를 추가한다.

switch 구문 예시

case에 비교값에 범위 연산자도 넣을 수 있다. 한정된 범위가 명확지 않다면 default는 필수이다. case 1, 2처럼 여러 개의 항목을 한번에 지정할 수 있다.

let number: Int = 4

switch number {
case 0: print("0")
case 1, 2: print("1 또는 2")
case 3...: print("3 이상")
default: print("0 이하")
}
// 3 이상

fallthrough 키워드를 사용해 case에 해당되면 그 다음 case를 실행하도록 할 수 있다.

let number: Int = 3

switch number {
case 0: print("0")
case 1, 2: print("1 또는 2")
case 3...: fallthrough
default: print("0 이하")
}
// 0 이하

와일드카드 식별자(_)를 사용할 수 있다.

let node: (Int, Int) = (0, 1)

switch node {
case (_, 0): print("우측 0")
case (_, 1): print("우측 1")
default: print("해당 없음")
}
// 우측 1

where 키워드를 사용하여 case를 확장할 수 있다.

let node: (Int, Int) = (0, 1)

switch node {
case (_, 0): print("우측 0")
case (_, 1) where node.0 != 0: print("좌측 0이 아님, 우측 1")
default: print("해당 없음")
}
// 해당 없음

열거형과 같이 한정된 범위의 값을 입력 값으로 받게될 때 모든 case를 구현한다면 defalut를 구현하지 않아도 된다.

enum Alphabet {
    case a, b, c
}

let alphabet: Alphabet = .a

switch alphabet {
case .a: print("A")
case .b: print("B")
case .c: print("C")
}
// A

열거형에 새로운 case를 추가했지만 switch 구문의 내부 코드를 수정하지 않았다면 case _의 상황이 발생하기에 컴파일러 경고가 뜨지 않는다. 문법적으로는 오류가 없지만 논리적 오류가 생길 여지가 생기기에 @unknown 속성을 사용한다.

enum Alphabet {
    case a, b, c, d
}

let alphabet: Alphabet = .d

switch alphabet {
case .a: print("A")
case .b: print("B")
case .c: print("C")
@unknown case _: print("?")
}

6.2 반복문

반복문은 같거나 비슷한 명령어를 반복 실행할 때 사용한다. 특히 배열과 같은 시퀸스, 순서가 있는 데이터를 편리하게 처리한다.

6.2.1 for-in 구문

반복적인 데이터나 시퀸스를 다룰 때 사용한다.

for i in 0...2 {
    print(i)
}
// 0
// 1
// 2
let array: [String] = ["a", "b", "c"]

for (index, char) in array.enumerated() {
    print(index, char)
}
// 0 a
// 1 b
// 2 c
for char in "hi" {
    print(char)
}
// h
// i

스위프트에 익숙해지고 함수형 프로그래밍 패러다임을 이해하면 for-in 구문보다는 map, filter, flatMap 등을 더 많이 사용하게 된다. 위의 for-in 구문 대신 map 함수를 사용할 수 있다. 추후 15장에서 다룬다.

"hi".map({
    print($0)
})
// h
// i

6.2.2 while 구문

while 구문은 Bool 타입의 특정 조건이 성립하는 한 블록 내부의 코드를 반복 실행한다. for-in 구문과 마찬가지로 continue, break 등의 제어 키워드 사용이 가능하다.

var number: Int = 0

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

6.2.3 repeat-while 구문

repeat 블록의 코드를 최초 1회 실행한 후, while 다음의 조건이 성립하면 블록 내부의 코드를 반복 실행한다. 아래의 예시를 보면 while 구문과는 다르게 repeat 구문은 while 다음의 조건이 성립하지 않아도 1회 실행되었다.

var number: Int = 

repeat {
    number += 1
    print(number)
} while number < 0
// 1

while number < 0 {
    number += 1
    print(number)
}

6.3 구문 이름표

반복문 앞에 이름과 함께 콜론을 붙여 구문의 이름을 지정할 수 있다. 제어 키워드와 함께 이름이 지정된 구문을 제어한다.

var numbers: [Int] = [3, 30, 300, 3000]

numbersLoop: for number in numbers {
    if number > 30 {
        continue numbersLoop
    }
    
    var count: Int = 0
    
    printLoop: while true {
        print(number)
        count += 1
    
        if count == number {
            break printLoop
        }
    }
    
    removeLoop: while true {
        if numbers.first != number {
            break numbersLoop
        }
        numbers.removeFirst()
    }
}

// 3
// 3
// 3

print(numbers) // [30, 300, 3000]
profile
👩‍💻

0개의 댓글