본문 바로가기

Programming/Swift for Beginners

[Swift] 025 Making Decisions - 3 (조건문 - switch-case) for beginners




의사 결정(Making Decisions) - Switch-Case

스위치문 사용(Switching things around)

앞의 예문에서는 세 개의 if 문이 가능한 case를 처리했지만 비교할 가능성이 더 있다면 어떻게 해야 할까요? 반복되는 if문이 다소 길면 코드를 입력하는데 지루하고 읽는 것도 어려울 것입니다. switch문은 값을 검토해서 몇 가지 패턴과 비교합니다. 그런 다음, 처음 매칭되는 패턴이 있는 코드 블록을 실행시킵니다. if문을 사용할 때보다 switch문은 다수의 코딩을 처리할 때 매우 유용합니다. switch문은 여러가지 가능한 경우로 구성되어 있습니다. 각 경우는 case라는 키워드로 시작됩니다. 특정 값과 비교할 수도 있지만, Swift에서는 더욱 복잡한 패턴과 비교하는 여러가지 방법이 있습니다.

아래 예제 코드를 입력하고 정확하게 어떤 결과가 나타나는지 결과를 확인해 보겠습니다.

treeArry += ["Cherry"]

for tree in treeArry {
    switch tree {
        case "Oak":
            print("Furniture")
        case "Pecan":
            print("Pie")
        case "Maple":
            print("Syrup")
        default:
            print("Wood")
    }
}

for 루프 내의 래핑된 switch-case문


switch 키워드와 tree 변수를 보여줍니다. 각각의 tree 변수는 47행에서 for 루프 반복을 실행하는 동안 treeArry 의 각 멤버에 할당됩니다. 그 밑으로 여러 개의 case문을 나열하고 마지막에 닫는 괄호를 넣습니다. Swift는 각 case문에 멈춰서 일치하는 것이 있는지 tree 변수를 평가합니다. 일치하는 것을 찾게 되면 코드는 트리거된 case문과 그 다음 실행되는 case문 사이에서 바인딩된 코드가 실행됩니다.


위 예제에서 default 키워드가 하는 일이 무엇일까 궁금할 것입니다. case문으로 다른 case문이 모두 매치에 실패했을 때 실행되는 코드입니다. 이 예제에서는 세 개의 tree 타입이 모두 case문에 매치되었기 때문에 default가 실행되지 않았습니다. 그럼 4번째 tree를 배열에 추가하면 어떤 결과가 나타날까요?


배열 내에 새로운 값에 일치하는 case문이 없기 때문에 default문이 실행될 것입니다. 그리고 결과로 "Wood"가 출력될 것입니다.

Break 문 (Where's the break?)

Objective-C 언어에 익숙한 사용자는 Objective-C로 switch-case 문을 사용해 본적이 있을 것입니다. 그리고
각각의 case에 break문이 어디에 있을까 궁금할 겁니다. 간단하게 말하면 Swift언어는 break문이 필요 없습니다.
Swift는 일치하는 조건이 있는지 case문이 루프를 돌다가 실패했다고 암묵적으로 이해하게 됩니다. 그리고 break문
처럼 개입하는 코드는 실행되지 않습니다.

단일 case의 다중 상수


Pecan과 Cherry 에 "Pie"라는 단어가 출력되도록 조정하려면 조건문을 어떻게 수정해야 할까요? 확실하게 실행되는 해결 방법으로는 "Cherry"와 동일한 변수 tree의 경우를 포함하는 또 다른 case문을 추가하는 것입니다. 그러나, case문을 추가하는 것보다는 좀더 깔끔한 대안이 있습니다. Swift는 평가할 때 단일 case에 두 개 이상의 값을 결합할 수 있도록 해줍니다. "Pecan"과 "Cherry"를 수정하고 오른쪽의 사이드바에서 결과를 확인합니다.


Swift는 "Pecan"과 "Cherry"의 경우를 인지하고 "Pie"를 출력하라는 코드가 두 번 실행되었습니다. 이런 유연성 때문에 일반적으로 사용되는 다른 조건문에 비해 switch-case문이 더 강력한 대안이 되는 것입니다.


지금까지 switch-case문을 사용해 문자열을 평가했습니다. 이는 숫자만 평가할 수 있는 Objective-C와 C 언어와 같은 프로그래밍 언어보다는 더 많은 일을 해낼 수 있습니다. Swift 언어는 범위를 포함하는 숫자를 비교하기가 매우 쉽습니다. 다음 예제는 switch-case문을 사용해 숫자 1에서부터 9까지의 서수 축약형을 선언문의 끝에 추가하는 것으로 숫자 비교가 얼마나 쉬운지 보여줍니다.


var position = 8

switch position {
    case 1:
        print("\(position)st")
    case 2:
        print("\(position)nd")
    case 3:
        print("\(position)rd")  
    case 4...9:
        print("\(position)th")
    default:
        print("Not covered")
}

수치값에 switch-case문 사용

position 이 변수 8로 선언되었습니다. 변수가 매치되는 케이스가 있는지 평가하는 switch-case문이 실행됩니다. 숫자 4에서 9까지 모든 숫자가 "th"로 끝나기 때문에 Swift의 범위 연산자 (...) 를 사용해 숫자 4에서 9 사이의 숫자를 모두 지정하고 나머지 숫자는 그 위의 행에서 처리했습니다.