본문 바로가기
공부/스위프트

[스위프트] 조건문(if, guard, switch) 종류와 사용법

by 초코팅촉 2023. 7. 3.
728x90

일반적으로 언어가 작성되고 실행되는 순서 및 방향들(흐름)을 제어하는 것을

흐름 제어 구문, 흐름 제어문, 제어 흐름 여러가지로 부르는데,

필자는 흐름 제어 구문으로 칭하겠다.

 

흐름 제어 구문의 종류에는 여러가지가 있는데

일반적으로는 다음의 세가지를 가장 많이 얘기한다.
• 반복문(Loop Statements)
• 조건문(Conditional Statements)
• 제어 전달문(Control Transfer Statements)

 

이중 조건문에 대해 알아보자.

조건문

if

가장 많이 쓰이는 구문중 하나이다.
조건식을 주고 조건식이 참일 경우 실행,
거짓이면 건너가는데 뒤에 else if문이 있다면 else if문으로 간다.
만약 else if도 만족 못한다면 else문으로 간다.
else if와 else는 생략할 수 있기 때문에 if문 하나만 써도 정상적으로 작동한다.

if 조건식 {
    //실행될 내용1
} else if 다른 조건식 {
    //실행될 내용2
} else {
    //앞에서 하나도 안걸리면 최후에 실행될 내용
}

//예시
if 1 < 2 {
    print("1은 2보다 작다.")
} else if 2 < 3 {
    print("딴건 모르겠고 2는 3보다 작다.")
} else {
    print("나는 수학에 약하다.")
}
/*
* 첫 조건식이 참이라 정상적으로 실행된다.
*
*    실행 결과
*    1은 2보다 작다.
*/

guard

기본적으로 if문과 같다고 볼 수 있으나 큰 차이점이 존재한다.
바로 else문을 필수로 붙여야 한다는 점이다.
그 이유는 guard문은 치명적인 오류가 발생할 경우 이를 사전에 막기 위해 존재하기 때문이다.

guard 조건식 else {
    //조건식이 거짓이면 실행될 내용
}

//예시
func divide(base: Int) {

    guard base !=0 else {
        print("연산이 불가능합니다.")
        return
    }

    let result = 100 / base
    return result
}

예시에 갑자기 다른 내용이 등장해서 어렵게 느껴질 수 있다.
별게 아니라 나누기 함수를 선언한 것이다. 숫자는 0으로 나눌 수 없다.
따라서 guard문을 넣어 들어온 값이 0이 아니면 나눈 몫을 반환하고
들어온 값이 0이면 바로 "연산이 불가능합니다."를 출력하고 함수를 종료한다.

직관적으로 만들고자 한것 같다. 주로 저런식으로 쓰게 되는데 조건식이 거짓일때 내용이 실행되는 거니까
조건식을 반대로 쓰면 된다.

switch

입력이 정해져 있을 경우에 사용하는 조건문이다.
예를 들자면 성적을 산출할때 절대 평가를 한다면
맞은 문제 개수에 따라 성적이 결정되므로 이런 경우 switch를 쓴다.

switch 변수 {

    case 변수의 조건 :
        //일치시 실행 구문

    case 변수의 다른 조건 :
        //일치시 실행 구문

    default :
        //전부 불일치시 실행될 기본 구문, 생략은 불가능하다.
}

//예시
var grade = "A"

switch grade {

    case "A" :
        print("Your Grade is A!")

    case "B" :
        print("Your Grade is B")

    default :
        print("Oh...")
}
/*
*    실행 결과
*    Your Grade is A!
*/

이렇게 값에 따라 결과가 달라진다.
한가지 스위프트에서 switch의 특이점은 바로
다른 언어에서는 매칭되는 몇가지 값들이 뜻이 통하는 경우(예를들어 a와 A는 둘다 알파벳 a이다.)에
case: 구문을 내부 구문 없이 연속적으로 쓰면 한번에 실행됐지만
스위프트에서는 명시적으로 fallthrough라고 써줘야 한다.

//예시
var grade = "a"

switch grade {

    case "a" :
        fallthrough
    case "A" :
        print("Your Grade is A!")

    case "B" :
        print("Your Grade is B")

    default :
        print("Oh...")
}
/*
*    실행 결과
*    Your Grade is A!
*/

아니면 아예 저런 경우엔 묶어서 써줘도 똑같이 작동한다.

//예시
var grade = "a"

switch grade {

    case "a", "A" :
        print("Your Grade is A!")

    case "B" :
        print("Your Grade is B")

    default :
        print("Oh...")
}
/*
*    실행 결과
*    Your Grade is A!
*/

복잡하게 쓰려면 튜플도 쓸 수 있고 범위 연산자도 쓸수있다. where도 쓸 수 있다.

//예시
var value = (3, 4)

switch value {
case let (x, 1...5) :
        print("튜플의 두번째 값이 1과 5사이일때 첫번째 값은 \(x)입니다.")

    case let (x, y) where x == y :
        print("두 값은 같다.")

    default :
        print("aaaaa")
}
/*
*    실행 결과
*    두 값은 같다.
*/

 

 

스위프트 문법 - 흐름제어 조건문