[Swift] 조건문(If 와 Switch)

Geon·2022년 9월 29일

Swift 기초

목록 보기
8/10
post-thumbnail

If

Swift에서의 조건문은 다른 언어들의 문법과 별반 다르지 않다. if 뒤에 조건을 걸어주고 중괄호 안에 해당 조건을 만족하면 실행할 코드를 입력한다.

if 조건식 {
 //조건을 만족하면 실행
}



else의 활용은 아래와 같다. if에 걸어둔 조건을 만족하지 않는다면 else 중괄호 내의 코드가 실행된다.

if 조건식 {
 //조건을 만족하면 실행
}
else{
 //if 조건을 만족하지 않으면 실행
}



if에 걸어둔 조건을 만족하지 않을 경우 else if를 통해 또다른 조건을 명시할 수 있다.

if 조건식1 {
 //조건1을 만족하면 실행
}
else if 조건식2 {
 //조건1을 만족하지 않으면서 조건2를 만족하면 실행
}
else{
 //조건1과 2를 모두 만족하지 않으면 실행
}



위의 규칙을 이용해 특정 수가 짝수인지, 홀수인지를 판별해보는 코드를 만들어보면 아래와 같다.

let num = 123
if num >= 0 { //만족하지 않으면 맨 밑에 else 문으로
	if num % 2 == 0 {
		print("짝수입니다.")
	}
	
    else if num % 2 == 1 {
		print("홀수입니다.")
	}
}
else {
	print("음수입니다.")
}

결과 : 홀수입니다.

값이 123인 num이라는 상수를 선언하고, 우선 이것이 0 이상의 수인지 판별한다. 0 이상의 수이면 조건을 만족하므로 조건문 내부로 들어가고, 하위의 조건문들을 통해 2로 나눈 나머지가 0이면 짝수로, 1이면 홀수로 판별한다.

만약 0 이하의 수이면 맨 위의 조건문을 만족하지 못하여 짝수인지 홀수인지 판별하는 작업을 하지 않고 맨 아래의 else문의 코드가 실행된다.


Switch

Switch문은 값의 일치 여부에 따라 실행할 코드가 결정된다. 기본적인 형식은 아래와 같다.

switch 비교대상{
case pattern : 
	//pattern과 일치하면 실행될 명령
case pattern1, pattern2 :
    //두개의 값 중에 하나라도 일치하면 실행
default : 
	//나머지 경우에 실행
}

여기서 눈에 띄는 부분은 두번째 case에 값을 여러개 써준 것인데, 여러개의 값(패턴) 중에 일치하는 것이 하나라도 있다면 하위 명령이 실행된다. 마지막의 default는 if 문에서 else와 같은 역할로, case에서 비교하는 값 중에 일치되는 것이 없을 경우 실행된다.

case문은 switch 블록 내에서 하나 이상 반드시 존재해야 하며, default는 비교대상이 가질 수 있는 모든 경우의 값들을 위에 case들에 명시해주었다면 생략이 가능하다. 추가로, case와 default문에는 반드시 한줄 이상의 실행 코드가 있어야 한다는 점을 명심하자.


let num = 4
switch num {
case 1 :
	print("one")
case 2 : 
	print("two")
case 3, 4 : 
	print("three or four")
default : 
	break
}

결과 : three of four

4를 값으로 가지는 num이라는 상수를 선언한 후, switch 문을 통해 비교를 하는 과정이다. 4가 세번째 case에 명시되어 있으므로 print("three or four")가 실행되면서 해당 switch문을 탈출한다.

당연한 소리지만, 위 switch 문에서 정수형으로 표현할 수 있는 모든 값들이 case에서 명시되지 않았으므로 default를 명시해주어야 하며, default 조건을 만족 시 해당 switch문을 탈출하는 break가 실행된다.


Switch-where

case에 일치 여부를 판별하도록 선언한 pattern에 where을 통해 세부 조건을 명시할 수 있다. 형식은 아래와 같다.

switch 비교대상{
case pattern where condition : 
	//실행 코드
default : 
	//실행 코드
}

패턴과 그 패턴에 대한 세부조건이 where에 명시되고, 이 두가지를 모두 만족해야만 해당 case의 실행 코드가 실행된다. 이것을 활용한 예제는 아래와 같다.

let num = 4
switch num {
case let x where x <= 10 :
	print(x)
default : 
	break
}

결과 : 4

case에서 pattern을 명시하는 부분에 기존에는 case 4 : 이런식으로 값을 적었다면, 이번엔 let x라는 코드를 썼다. 이것은 '값 바인딩'이라는 문법이다. (값 바인딩에 대해선 아래에서 설명하겠다.)

우선 위 코드의 경우 num이 case 안에 있는 상수 x에 대입되고, 그 값을 where의 조건식으로 판별한다. 10보다 작다는 조건을 만족하므로 print(x)가 실행된다.

Value Binding Pattern

case let name:
case var name:

switch 문에서 비교할 대상을 상수나 변수에 대입하여 사용하는 문법이다.

let number = 1
switch number{
case let x :
	print(x)   
}

결과 : 1

xnumber가 대입되어서 case의 비교에 사용되는 모습이다. 보통 아래와 같이 where절과 함께 조건을 걸어 사용하곤 한다.

let number = 1
switch number{
case let x where x == 0 :
	print("number의 값은 0")
default : 
	print("해당 없음")
}

결과 : 해당 없음

case 내부에서 바인딩된 상수 x는 해당 case나 스위치를 벗어나서 사용할 수 없다. 만약 다른 case에서 또 한번 값 바인딩을 통해 다른 값으로 비교하고 싶다면 아래와 같이 새롭게 바인딩하여 사용해주면 된다.

let number = 1
switch number{
case let x where x == 0 :
	print("number의 값은 0")
case let y where y == 1 : 
	print("number의 값은 1")
default : 
	print("해당 없음")
}

결과 : number의 값은 1



Interval Matching (범위 매칭)

이번엔 특정 값만 비교하는 것이 아닌, 비교할 범위를 정하여 일치 여부를 묻는 Interval Matching에 대해 알아보자.

let battery = 13
switch battery {
case 0..<15 : //0부터 15미만
    print("배터리 부족")
case 15...50 :
    print("일반 배터리")
case 51...80 :
    print("배터리 여유")
case 81... : //81 이상
    print("배터리 충분")
default:
    print("전원 꺼짐")
}

결과 : 배터리 부족

battery의 값이 13이니 첫번째 case에 범위가 포함되어 print("배터리 부족") 코드가 실행되는 모습이다.



Fall Through

switch 문은 비교 대상의 값과 case의 pattern이 일치하면 해당 case의 실행 코드를 실행시킨 후 switch 문을 탈출해버린다. 하지만 실행 코드에 fallthrough를 붙이게 되면 일치하는 case를 발견한 후 해당 case문의 실행코드를 실행시킨 후, switch 문을 탈출하지 않고 바로 다음번 case를 강제 실행시킨다. 예시 코드를 통해 둘의 차이점을 비교해보자.

//fallthrough 미사용
let num = 2
switch num {
case 1:
   print("one")
case 2:
   print("two")
case 3:
   print("three")
default:
   print("others")
}

결과 : two

fallthrough를 사용하지 않으면 두번째 케이스와 값이 일치하므로 two가 출력되고 그대로 switch 문은 종료된다. 이번엔 사용한 코드를 보자.

//fallthrough 사용
switch num {
case 1:
   print("one")
case 2:
   print("two")
   fallthrough //다음번 case를 값의 일치여부와 관계없이 실행
case 3:
   print("three")
default:
   print("others")
}

결과 : two
	  three

case 2의 값과 일치하여 two가 실행되고, fallthrough가 명시되어 있기에 값의 일치여부와 상관 없이 다음번 case가 실행되어 "three" 까지 출력되고 switch문을 탈출한다.

profile
별에 별 지식 저장해놓고 꺼내먹기📚

0개의 댓글