4.2.4 switch 구문
switch 구문은 앞에서 다룬 if와 guard처럼 분기문의 일종이지만, 처리 방식은 앞에서와 다릅니다. switch 구문은 입력받은 값을 조건식 여부가 아니라 패턴으로 비교하고 그 결과를 바탕으로 실행 블록을 결정하는 조건문입니다. 이 구문은 나열된 패턴들을 순서대로 비교하다가 일치하는 첫 번째 패턴의 코드 블록을 실행합니다.
switch 구문을 굳이 사용하지 않고 if~else if 구문만으로도 필요한 코드 작성은 가능하지만, 다양한 가능성이 있는 여러 개의 조건 비교에 효율적으로 대응하기에는 조금 부족한 if 구문의 대안이 switch 구문이라고 할 수 있습니다.
switch 구문의 형태는 다음과 같습니다.
switch <비교 대상> {
case <비교 패턴1> :
<비교 패턴1이 일치했을 때 실행할 구문>
case <비교 패턴2>, <비교 패턴3> :
<비교 패턴2 또는 3이 일치했을 때 실행할 구문>
default :
<어느 비교 패턴과도 일치하지 않았을 때 실행할 구문>
}
모든 switch 구문은 case 키워드로 시작하는 여러 가능한 패턴을 나열하는 방식으로 구성됩니다. 비교 대상과 비교 패턴이 일치할 경우 그에 해당하는 구문이 실행된 후 나머지 case에 대한 비교 없이 switch 구문을 종료하고, switch 구문 다음에 나오는 실행 블록으로 진행합니다. 만약 비교 패턴 어느 것과도 일치하지 않았다면, 맨 만지막에 작성된 default 구문의 코드가 실행됩니다.
스위프트의 switch 구문은 일치하는 비교 패턴이 있을 경우 해당 블록의 실행 코드를 처리하고, 더 이상의 비교 없이 전체 분기문을 종료합니다. 설사 일치하는 비교 패턴이 여러 개 있더라도 맨 처음 일치하는 case 구문 하나만 실행하죠. 오직 하나의 case 구문만 처리하고 나면 더이상 비교를 진행하지 않습니다. 다른 언어에서 switch 구문의 각 case 키워드 블록마다 추가해야 하는 break 구문을 스위프트에서 생략할 수 있는 것은 이 때문입니다.
let val = 2
switch val {
case 1 :
print("일치한 값은 1입니다")
case 2 :
print("일치한 값은 2입니다")
case 2 :
print("일치한 값은 2가 더 있습니다")
default :
print("어느 패턴과도 일치하지 않았습니다.")
}
일치한 값은 2입니다
위에서 보는 것처럼 일치하는 구문이 두개이지만 위의 구문만 수행되고 종료 되었습니다. 이는 일치하는 비교 패턴 하나만 실행한 다음 종료하는 스위프트의 switch 구문 특성 때문입니다.
switch 구문에는 패턴이 일치하는 case 블록을 실행하는 대신, 그다음 case 블록으로 실행 흐름을 전달하는 문법이 있는데, 이를 Fall Through라고 합니다. Swift에서는 다른 언어와 달리 명시적으로 fallthrough 구문을 사용해야 Fall Through가 적용됩니다.
let sampleChar : Character = "a"
switch sampleChar {
case "a" :
fallthrough
case "A" :
print("글자는 A 입니다")
default :
print("일치하는 글자가 없습니다")
}
글자는 A 입니다
fallthrough 구문이 사용된 case 블록은 비교 패턴이 일치할 경우 인접한 case 블록으로 실행 흐름을 전달합니다. fallthrough에 의해 실행 흐름을 전달받은 case 블록은 비교 패턴의 일치 여부와 상관없이 작성된 구문을 실행한 후 switch 구문을 종료합니다.
switch의 case구문에서 사용할 수 있는 비교 패턴은 위와 같은 패턴만 있지 않고, 뒤에서 배울 튜플, 객체, 범위 연산자 등 다양하게 사용될 수 있습니다.
Last updated