大器晩成

조건문(switch) 본문

iOS/Swift 문법

조건문(switch)

zerobugpark 2024. 11. 1. 00:22

 

Switch문은 여러 값이나 조건에 따라 코드를 분기 처리할 때 사용됩니다. switch문은 단순한 값 비교뿐만 아니라, 패턴 매칭, 값 바인딩, 복학 조건 등을 지원합니다. (if문보다 한정적인 상황에서 사용됩니다.)

 

Switch문의 특징

  • switch문은 비교하고 있는 값의 모든 경우의 수를 반드시 다루어야 합니다.(exhaustive: 하나도 빠뜨리는 것 없이 철저한)
  • 모든 case에 일치되는 패턴을 찾지 못했을 경우에 대비하여 반드시 default 구문을 추가해야 하며, 모든 패턴을 만족할 수 있다면 default 구문은 생략이 가능합니다.
  • 스위치문에서 케이스의 ,(콤마)는 또는의 의미로 하나의 케이스에 여러 비교패턴을 넣을 수 있습니다.
  • 각 케이스에는 문자이 최소 하나 이상이 있어야 하며, 만약 없을 경우 컴파일 에러가 발생합니다.(의도하지 않는 실수를 방지)
  • 패턴 매칭(~=) : switch 문은 단순한 값 비교뿐만 아니라, 패턴 채팅을 통해 복잡한 조건을 처리할 수 있다.

Switch문 작성 시 유의사항

  • 각 케이스에는 문장이 최소 하나 이상 있어야 합니다. (실행하지 않으려면 반드시 break를 입력해야 합니다.)
  • switch 문은 가능한 모든 경우의 수를 반드시 다루어야 하며, 다루지 못할 경우 디폴트 케이스가 반드시 있어야 합니다.
  • 비교패턴은 참 또는 거짓이어야 하며, 값이 될 수는 없습니다.

기본구문

switch <비교 대상> {
case <비교패턴1>:
    // 비교패턴1이 일치할 때 실행될 코드
case <비교패턴2>:
    // 비교패턴2가 일치할 때 실행될 코드
case <비교패턴3>, <비교패턴4>:
    // 비교패턴3 또는 4이 일치 했을 때 실행될 코드>
default:
    // 어느 패턴과도 일치하지 않을 때 실행될 코드
}

 

기본예제

let fruit = "apple"

switch fruit { //fruit == apple
case "apple": //fruit가 apple일 경우 해당 case문이 실행된다.
    print("It's an apple.")
case "banana":
    print("It's a banana.")
default:
    print("Unknown fruit.")
}
// 출력: It's an apple.


let number = 20

switch number { // number == 20
case 0, 1:
    print("0 또는 1 입니다.")
case 10, 20, 30:
    print("10 또는 20 또는 30입니다.")
default:
    break
}
// 출력: 10 또는 20 또는 30입니다.


# 잘못 작성된 예시 =====================
# 비교연산자와 값을 넣으면 안되고, 비교하려는 값이 와야합니다.

switch temperature {
case  < 0 :    //이런식으로 작성하면 안된다. ==>   ..<0
    print("영하 - 0미만")
case >= 0 && <= 18 :     //이런식으로 작성하면 안된다. ==>   0...
    print("0이상 무덥지 않은 날씨")
default :
    break
}
* 부등식을 사용될 수 없는 대신에, 범위 매칭을 지원합니다.

 

fallthrough

  • fallthrough 구문이 사용된 case 블록은 비교패턴이 일치한 경우 다음 case 블록으로 실행 흐름을 전달합니다.
  • 실행 흐름을 전달 받은 case 블록은 비교 패턴의 일치 여부와 상관없이 다음 구문을 실행한 후 switch 구문을 종료합니다.
let number = 10

switch number {
case 10:
    print("양수입니다.")
    fallthrough
case -10:
    print("음수입니다.")
    fallthrough
case 0:
    print("0입니다")
default:
    print("default 구문입니다.")
}
// 출력: 양수입니다.
// 출력: 음수입니다.
// 출력: 0입니다.

 

범위매칭

  • 범위를 사용하여 값의 범위를 쉽게 처리할 수 있습니다.
  • switch문에서는 부등식을 사용할 수 없는 대신에, 범위 매칭을 지원합니다.
  • 범위연산자, 패턴매칭 연산자 (참과 거짓의 결과가 나옴)
  • ~=연산자(패턴매칭 연산자) : 대상이 특정 범위에 속하는지 범위를 체크하는 연산자.
    (즉, 앞에 있는 범위내에 뒤에 있는 숫자가 포함되면 참인지 거짓인지 알려준다.)
  • case문에서는 부등식(<=, > 등)을 사용할 수 없음, 범위연산자로 만들어진 범위의 값으로 케이스를 정의해야 함.
var number = 30

0...40 ~= num //true(30은 0부터 40사이에 포함되어 있다)
40...100 ~=num //false

-----------------------------------------------

let age:Int = 30

switch age {
case 0...12: // Range: 0 ~ 12  (0...12 ~= 30 내부적으로 패턴매칭으로 확인)
    print("You are a child")
case 13...19: // Range: 13 ~ 19
    print("You are a teenager")
case 20...64: // Range: 20 ~ 64
    print("You are an adult")
case 65...: // Range: 65~
    print("You are a senior")
default:
    print("Invalid age")
}
//출력: You are an adult

 

값 바인딩

  • 바인딩: 다른 새로운 변수/상수 식별자로 할당
  • 매칭된 값을 변수나 상수에 바인딩하여 사용할 수 있다. 
# 바인딩의 일반적인 의미

var a = 7
var b = a // 바인딩한다. (다른 변수/상수의 새로운 식별자로 할당한다.)

let number = 20

switch number {
case let num:// number == num
    print(num)
default:
    break
}
// 출력: 20


# 예제1
var anotherPoint = (3, 0)

switch anotherPoint {
case (let x, 0):
    print("The point is on the x-axis at \(x).")
case (0, let y):
    print("The point is on the y-axis at \(y).")
case let (x, y):
    print("The point is at (\(x), \(y)).")
}
// 출력: The point is on the x-axis at 3.

# 예제2
anotherPoint = (0, 3)

switch anotherPoint {
case (let x, 0):
    print("The point is on the x-axis at \(x).")
case (0, let y):
    print("The point is on the y-axis at \(y).")
case let (x, y):
    print("The point is at (\(x), \(y)).")
}
// 출력: The point is on the y-axis at 3.

# 예제3
anotherPoint = (5, 5)

switch anotherPoint {
case (let x, 0):
    print("The point is on the x-axis at \(x).")
case (0, let y):
    print("The point is on the y-axis at \(y).")
case let (x, y):
    print("The point is at (\(x), \(y)).")
}
// 출력: The point is at the 5, 5

var anotherPoint = (3, 1)

switch anotherPoint {
case (let x, 1):
    print("The point is on the x-axis at \(x).")
case (1, let y):
    print("The point is on the y-axis at \(y).")
case let (x, y):
    print("The point is at (\(x), \(y)).")
}
// 출력: The point is at the 3, 1

 

패턴 매칭과 where 절

  • 일단 다른 상수 값에 바인딩한(넣은) 후, 조건절(참/거짓 문장)을 통해 다시 한번 더 조건 확인합니다
  • 바인딩된 상수는 케이스블록 내부에서만 사용가능하며, 상수 바인딩은 주로 where절하고 같이 사용합니다
  • 추가 조건을 지정하여 더 세밀한 제어가 가능합니다.
  • where 키워드는 조건을 확인하는 키워드입니다.
#예제1
let number = 10

switch number {
case let num where num % 2 == 0: //num은 10이며, num % 2 == 0 이면 참을 반환
    print("짝수입니다.")
default:
    print("홀수입니다.")
}
// 출력: 짝수입니다.

#예제2
let number = 10

switch number {
case let num where num > 5:
    print("5보다 큰 숫자입니다.")
default:
    print("5보다 작거나 같은 숫자입니다.")
}
// 출력: 5보다 큰 숫자입니다.

# 예제3
let yetAnotherPoint = (1, -1)

switch yetAnotherPoint {
case let (x, y) where x == y:
    print("The point is on the line x == y.")
case let (x, y) where x == -y:
    print("The point is on the line x == -y.")
case let (x, y):
    print("The point is at (\(x), \(y)).")
}
// 출력: The point is on the line x == -y.
// x == -y -> 1 == -(-1) -> 1 == 1

 

 

Etc.

* if 구문이나, Switch 분기문이라고 하며, 분기란 선택적으로 코드를 실행시키는 것입니다.

* C언어나 자바 등 많은 언어에서 스위치 구문이 있고 유사하지만, 실행방식에서 차이가 있습니다. C언어나 자바에서는 비교 패턴이 일치할 경우 우선 실행 구문을 처리한 다음, 나머지 case에 대한 비교를 계속 진행하고 추가로 일치하는 패턴이 있다면 이를 모두 실행하고, 마지막 case를 비교한 후에야 분기문을 종료합니다. 하지만 스위프트에서 스위치 구문은 일치하는 비교 패턴이 있을 경우 해당 블록의 실행코드를 처리하고 더 이상의 비교 없이 전체 분기문을 종료합니다. 설사 일치하는 비교 패턴이 여러 개 있더라도 맨 처음 일치하는 case 구문 하나만 실행합니다.

728x90

'iOS > Swift 문법' 카테고리의 다른 글

삼항연산자  (0) 2024.11.01
튜플(Tuple)  (0) 2024.11.01
조건문(If문)  (0) 2024.10.31
범위 연산자 (Range Operators)  (0) 2024.10.31
기본 연산자 (Basic operators)  (2) 2024.10.31