본문 바로가기
Programming/Swift

[iOS Swift5] if else, guard 제어 흐름 관리하기

by 개발자 염상진 2024. 1. 5.

 

Swift5 제어흐름 관리하기

안녕하세요 About Tech 입니다. 이번 포스팅에서는 Swfit 언어에서 제어흐름을 어떻게 관리할 수 있는지 알아보고자 합니다. 제어흐름은 조건식이라고도 불리는 if 문이나 guard 문을 말하는데요, 개발은 로직을 이용하는 것이기도 하고, 프로그램의흐름을 통제하는 것이기 때문에 제어흐름(Control Flow)로 불리고 있습니다. 

제어흐름에는 크게 조건부 제어흐름(Conditional Control Flow)과 반복제어(Loopin Control Flow) 문으로 구분됩니다. 코드를 몇번 반복해서 실행할지를 결정하는 반복 제어흐름과 특정 조건에 따라 코드를 실행할지 뛰어넘을지를 결정하는 조건식으로 구분됩니다. 

 

 

Swift 조건부 제어흐름

조건부 제어흐름은 크게 두가지가 있습니다. 첫번째는 프로그래밍을 해보신 분들이라면 바로 이해할 수 있는 if - else 조건문입니다. 조건식에 값이 true / false 에 따라서 하위 코드가 실행되는 여부를 결정할 수 있습니다. 

if - else 구문 사용하기

if 조건식1 {

} else if 조건식2 {

} else {

}

조건식에 따라서 실행해야 할 코드들을 분기처리 할 수 있습니다. 예를 들어 아래 코드를 작성해보도록 하겠습니다.

let temperature = 25

if temperature < 10 {
    print("It's cold.")
} else if temperature >= 10 && temperature < 20 {
    print("It's cool.")
} else if temperature >= 20 && temperature < 30 {
    print("It's warm.")
} else {
    print("It's hot.")
}

temperature 라는 변수에 25 값이 할당되었습니다. 이 값에 따라서 분기처리가 되고 최종적으로는 "It's warm"이라는 문구가 출력됩니다. 

여기서 눈치 빠르신 분들이라면 눈치 채셨겠지만 Swift 에서는 한줄의 코드라도 반드시 중괄호를 처리해주셔야 된다는 점입니다. Javascript에서는 조건문에 따른 분기된 코드가 한줄이라면 괄호를 해주지 않아도 되는 것과 차별되는 부분입니다. 

 

조건부 제어 흐름의 두번째 구문은 guard 문입니다. 실제 코딩에서 굉장히 많이 사용되는 구문입니다. guard 구문은 Swift2 버전에서 도입되었는데요, if 구문과 guard 구문의 가장 큰 차이점은 분기처리가 만약 false 인 경우 if 구문 보다 빨리 분기 처리가 가능하다는 장점이 있습니다. 

guard 구문을 사용하는 대표적인 예는 데이터베이스에서 데이터를 가져올 때 만약 적절한 데이터가 들어오지 않는 경우 하위 코드를 모두 생략하고 함수에서 빠져나올 수 있기 때문에 메모리와 시간을 절약할 수 있다는 장점이 있습니다. 

func greet(person: String?) {
    guard let name = person else {
        print("No name provided.")
        return
    }
    
    print("Hello, \(name)!")
}

// Example usage
greet(person: "Alice") // Output: Hello, Alice!
greet(person: nil) // Output: No name provided.

 

위의 예시를 보시면 greet 함수에서는 person이라는 옵셔널 매개변수를 받고 있습니다. 만약 person에 nil 값이 할당되면 하위 코드를 실행할 의미가 없기 때문에 greet 함수에서 바로 빠져나오게 됩니다. 만약 위의 코드를 if 구문으로 처리한다면 아래 처럼 됩니다.

 

 

func greet(person: String?) {
    if let name = person {
        print("Hello, \(name)!")
    } else {
        print("No name provided.")
        return
    }
}

// Example usage
greet(person: "Alice") // Output: Hello, Alice!
greet(person: nil) // Output: No name provided.

 여기서는 5번째 줄 까지 와서야 nil 값을 인지하고 greet 함수를 빠져나갈 수 있게 됩니다. guard 문으로 함수 첫번째에서 바로 분기처리가 가능한 점이 만약 100줄 이상의 코드를 포함한 함수라고 한다면 활용도가 높다는 것을 알 수 있습니다. 

 

Switch 구문

if-else 구문으로 조건값을 분기할 수 있지만 조건값이 여러개일 경우에는 switch구문이 더 합리적인 선택이 될 수 있습니다. 

switch 표현식 {
	case 값1: 코드
    case 값2: 코드
    case 값3: 코드
}

우선 number 변수에 7을 할당했습니다. 그리고 case 별로 코드를 나눠서 실행할 수 있습니다. 여기서 재밌는 점은 case를 병합할 수도 있고 범위 연산자를 사용해서 특정 구간에서 코드를 분기할 수도 있습니다. 마지막에 케이스에 해당하지 않는 기본값은 default로 지정해서 어떤 조건도 만족하지 않는 경우에 대비할 수도 있습니다. 

let number = 7

switch number {
case 0:
    print("Zero")
case 1, 2, 3:
    print("Small number")
case 4...7:
    print("Medium number")
case 8...:
    print("Large number")
default:
    print("Negative number")
}

 

만약 C 언어를 사용해보신 분들이라면 아래와 같이 사용할 수 있습니다. Swift 언어와 다른 점은 case 별로 break을 포함하면서 특정 구문에서 빠져나왔을 때를 대비하지 않아도 된다는 점입니다. Swift 에서는 특정 케이스에 포함되면 바로 switch 구문을 빠져나오게 됩니다. 

#include <stdio.h>

int main() {
    int day = 3;

    switch(day) {
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n");
            break;
        case 4:
            printf("Thursday\n");
            break;
        case 5:
            printf("Friday\n");
            break;
        case 6:
            printf("Saturday\n");
            break;
        case 7:
            printf("Sunday\n");
            break;
        default:
            printf("Invali

만약 다음 케이스로 넘어가기 위해서는 fallthrough 구문을 사용할 수 있습니다. 실행 흐름을 다음 case 구문으로 넘기면서 switch 구문을 연속적으로 사용할 수 있습니다. default에서도 뭔가를 해야 하는 경우 사용할 수 있습니다.

let number = 3
var description = "The number \(number) is"

switch number {
case 1:
    description += " One,"
    fallthrough
case 2:
    description += " Two,"
    fallthrough
case 3:
    description += " Three,"
    fallthrough
default:
    description += " Four or more."
}

print(description)

그렇다고 break 구문을 사용하지 못하는 건 아닙니다. 만약 조건값에 해당하지 않느다면 break을 써서 언제든지 switch 분기문을 빠져나올 수 있습니다. 

 

Swift 반복 제어흐름

반복문은 특정 조건을 만족하는 동안 반복적으로 실행되는 코드를 처리하는 제어흐름입니다. 대표적인 반복 제어 흐름은 for-in 구문이 있습니다. 또한 while, repeat, continue 구문을 사용할 수도 있습니다.

for-in

for 상수이름 in 범위 || 콜렉션(array, enum) {

}

for-in 구문은 범위 연산자(...)나 콜렉션을 순회하면서 상수를 가지고 와서 코드를 실행할 수 있습니다. 예를 들어보겠습니다. 

먼저 딕셔너리 형태의 person 이라는 콜렉션을 생성하고, key, value 쌍 값을 상수로 가져와서 순회하는 코드입니다. 

let person = ["name": "Alice", "age": 30, "city": "New York"]

for (key, value) in person {
    print("\(key): \(value)")
}

딕셔너리 뿐만 아니라 간단한 배열도 콜렉션으로 범위를 가져와서 순회할 수도 있습니다. 

let numbers = [1, 2, 3, 4, 5]

for number in numbers {
    print(number)
}

더 간단하게는 범위연산자(...)를 사용해서 범위를 지정한 후 순회할 수도 있습니다. 

for i in 1...5 {
    print(i)
}

만약 범위 연산자에서 가져오는 상수를 사용하지 않는 코드를 작성할 때는 상수이름을 '_'로 지정하시면 됩니다. 아래 코드는 단순히 'Hello' 문자열을 5번 반복하는 코드가 됩니다. 

for _ in 1...5 {
    print("Hello")
}

 

 

repeat - while

조건이 만족할 때 까지 순회해야 하는 경우라면 repeat - while 문을 사용할 수 있습니다. 먼저 while 문을 단독으로 사용할 수도 있고, 적어도 한번은 코드가 실행되어야 한다면 repeat-while 문을 사용할 수 있습니다. 

아래 코드를 보시면 count에 0이 할당되기 때문에 while문의 조건식이 참이 되는 경우 까지 수행이 될 것입니다. 하지만 만약 count에 5가 할당된다면 아래 코드는 전혀 실행되지 않고 종료되게 됩니다. 출력결과는 0 1 2 3 4가 됩니다.

var count = 0

while count < 5 {
    print(count)
    count += 1
}

반면 repeat - whlie 문은 적어도 한번은 코드를 실행한 후 조건식을 보기 때문에 먼저 5가 출력되고 다음 조건식을 봤을 때 false 값이 되기 때문에 그대로 종료되게 됩니다. 

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

continue

continue 구문은 특정 코드를 건너뛰고 반복문의 처음으로 복귀하는 특성을 가지고 있습니다. 아래 코드를 보시면 1부터 10까지 순회하면서 짝수인 경우를 건너뛰는 continue 문을 사용하고 있습니다. 출력결과는 [1,3,5,7,9]가 됩니다.

for number in 1...10 {
    if number % 2 == 0 {
        continue // Skips even numbers
    }
    print(number)
}

 

 

Swift Control Flow

이번 포스팅에서는 Swift에서 사용할 수 있는 조건식 제어흐름과 반복 제어흐름에 대해 알아보았습니다. 다른 프로그래밍 언어와 유사한 점이 많은 만큼 금방 적응해서 사용할 수 있습니다. Swift에서 제공하는 guard 문을 사용해서 더 빠르게 분기처리를 해서 효율적으로 코딩을 할 수 있습니다. 

 

🚀️ 도움이 되셨다면 구독좋아요 부탁드립니다 👍️

 

 

 

Xcode Playground 사용법 주석 라이브뷰 사용하는 방법

플레이그라운드란? 플레이그라운드는 xcode의 추가적인 기능으로 실시간으로 코드를 실행해볼 수 있는 개발환경입니다. 아이폰 앱을 개발하기 위해서 코딩부터 컴파일 그리고 디버깅의 일련의

about-tech.tistory.com

 

 

[iOS Swift5] 연산자와 표현식

Swift 연산자와 표현식 변수에 값을 할당하는 방법은 기본적으로 표현식을 따릅니다. 피연산자와 할당자 그리고 연산자를 통해 값을 생성하고 변수에 데이터를 저장할 수 있습니다. var number = 1 +

about-tech.tistory.com

 

 

[iOS Swift5] 상수와 변수 데이터 타입 옵셔널, 옵셔널 바인딩, 강제언래핑

Swift5 상수와 변수 프로그래밍 언어에서 데이터를 표현하는 방법은 다양합니다. iOS 8 이전까지는 Objective-C로 개발했지만 스위프트 언어가 등장하고 나서는 대부분 흐름이 스위프트로 새로운 기

about-tech.tistory.com

 

댓글