다른 말로 분기분(Branch Statements)라고도 불리는 조건문은 프로그램에서 하나 또는 그 이상의 조건값에 따라 특정 구문을 실행하도록 프로그램의 흐름을 분기하는 역할을 한다.
조건문에 사용되는 조건값은 프로그램이 어떻게 분기되고, 어느 부분의 코드가 실행될지를 결정하는 데 사용된다.
스위프트에서 제공하는 조건문은 크게 세 가지다.
- if
- guard
- switch
오늘은 if 구문에 대해서 알아보자.
1. if 구문
1-1. if
하나 또는 그 이상의 조건을 평가하고 결과에 따라 코드 블록의 실행 여부를 결정한다.
조건식의 평가 결과가 참(true) 일 때만 코드 블록 내부의 구문을 실행하고, 거짓(false)라면 코드 블록을 빠져나가 if 블록 다음에 위치한 코드를 수행한다.
// if문 예시
if < 조건식 > {
< 실행할 구문 >
}
if 다음에는 조건식이 사용되는데, 이 조건문은 반드시 Bool 타입의 참(true), 거짓(false)을 판단할 수 있는 형태의 구문이어야 한다.
C 스타일의 if 구문에서는 참, 거짓 대신 0이나 1도 사용할 수 있었지만 스위프트에서는 이를 허용하지 않는다. 또한 조건식이 복잡한 경우 소괄호 ( )를 사용하여 조건식을 감싸주어도 되지만, 강제사항은 아니다.
스위프트 공식문서에 나와있는 if 예제 코드다.
var temperatureInFahrenheit = 30
if temperatureInFahrenheit <= 32 {
print("It's very cold. Consider wearing a scarf.")
}
// Prints "It's very cold. Consider wearing a scarf."
먼저 변수 temperatureInFahrenheit를 선언하고 초기값으로 30을 넣어주었다.
그리고 조건을 temperatureInFahrenheit <= 32 ( temperatureInFahrenheit가 32보다 작거나 같으면 )로 주고 비교한 결과를 true / false로 반환해 준다.
temperatureInFahrenheit 변수에 할당된 30은 32보다 작기 때문에 조건 비교결과 참( true )으로 그 아래 코드인 print("It's very cold. Consider wearing a scarf.") 구문이 실행돼 출력이 된다.
1-2. if - else
if 문은 조건식이 true/false 중 어느 하나일 때에만 구문을 실행할 수 있다.
🙂 :만약 조건식이 조건식이 참일 때에는 A 구문을, 참이 아닐 때에는 B 구문을 실행하고 싶다면, 어떻게 해야 할까??
물론 아래와 같이 if 문을 연달아 두 번 작성하되 조건만 다르게 처리하는 방법을 떠올릴 수 있다.
var temperatureInFahrenheit = 40
if temperatureInFahrenheit <= 32 {
print("It's very cold. Consider wearing a scarf.")
}
if temperatureInFahrenheit > 32 {
print("It's not that cold. Wear a t-shirt.")
}
// Prints "It's not that cold. Wear a t-shirt."
하지만 이런 방식은 올바른 구현이 아닐뿐더러 정확한 표현도 아니다.
논리적으로 "참이 아님"이 곧 거짓을 뜻하는 것은 아니기 때문이다. 그리고 서로 완벽한 여집합을 이루지 못할 수 있다.
📝 여기서 완벽한 여집합을 이루지 못한다는 것은 두 조건문의 범위를 합쳤을 때 전체 범위가 되지 않거나, 또는 겹치는 범위가 생길 수 있다는 것!!
이러한 상황을 방지하고 주어진 요구사항을 만족시키기 위해 스위프트에서는 else 구문을 제공한다.
else 구문은 { }로 이루어지는 실행 블록을 가지는 구문으로, if 구문과 함께 사용되어 조건식의 결과가 참이 아닐 때만 해당 블록을 실행시킨다.
else 구문에는 조건식이 사용되지 않기 때문에 if 조건식이 없이 단독으로 사용할 수 없다.
// if-else문 예제
if < 조건식 > {
< 조건이 참일 때 실행할 구문 >
} else {
< 조건이 거짓일 때 실행할 구문 >
}
else 구문에 연결된 코드 블록은 조건식이 참이 아닌 모든 경우에 실행된다.
조건식에서 발생 가능한 모든 경우는 수학적으로 참이거나 참이 아닌 경우 둘 밖에 있을 수 없으므로 if와 else 둘 중 하나에는 반드시 속하게 된다. 또한 if와 else는 양립할 수 없기 때문에 두 코드 블록이 모두 실행되는 경우는 있을 수 없다.
📝 TMI : 이를 확률 용어로 이율배반 이라고도 함
논리적으로도 사실적으로도 동등한 근거가 성립하면서 양립할 수 없는 모순된 두 명제의 관계를 뜻
var temperatureInFahrenheit = 40
if temperatureInFahrenheit <= 32 {
print("It's very cold. Consider wearing a scarf.")
} else {
print("It's not that cold. Wear a t-shirt.")
}
// Prints "It's not that cold. Wear a t-shirt."
앞에 작성했던 if문에 else를 추가하였다.
변수 temperatureInFahrenheit가 32보다 작으면서 32보다 클 수 있는 경우는 존재할 수 없으므로 논리적으로 모든 조건식의 결과는 if 또는 else 중 하나가 걸리게 된다. 조건문에 사용된 값에 따라 실행 결과는 반드시 둘 중 하나가 출력이 되는 것이다.
변수 temperatureInFahrenheit에 할당된 값이 40이므로 조건식의 평과 결과는 거짓( false ) 다.
따라서 if 조건절을 건너뛰고 else 절이 실행되어 " print("It's not that cold. Wear a t-shirt.") "가 출력되는 것이다.
1-3. if 구문의 중첩
if 구문은 아래 그림처럼 중첩해서 사용할 수 있다.
// if구문의 중첩 예제
if < 조건식 > {
// 조건이 참일 때 실행할 구문
if < 조건식 > {
< 조건이 참일 때 실행할 구문 >
} else {
< 조건이 거짓일 때 실행할 구문 >
}
} else {
// 조건이 거짓일 때 실행할 구문
if < 조건식 > {
< 조건이 참일 때 실행할 구문 >
} else {
< 조건이 거짓일 때 실행할 구문 >
}
}
보통 이중, 삼중의 조건을 비교해야 할 때 많이 사용되는데 if 조건 안에 if 구문뿐만 아니라 else 절까지 중첩할 수 있고, else 절 내에서도 마찬가지다.
중첩된 if 조건은 여러 개의 조건을 다중으로 비교해야 할 때 사용하면 쉽게 구현할 수 있는 장점이 있지만, 너무 여러 번 중첩되면 코드의 가독성을 해칠 뿐만 아니라 코드 사이의 의존관계를 심화시키는 주 원인이 되기도 한다.
📝 일반적으로 3단게 이상의 중첩 구문을 사용하지 않는 것이 좋다. 너무 많으면 읽을 때 머리 아픔...😭
1-4. if - else if
🙂 : 다중 조건이 아니라 단순히 참, 거짓으로만 판단하기 어려운 여러개의 조건이 있을 때에는 어떻게 해야 할까?
if < 조건 1 > {
< 조건 1이 참일 때 실행할 구문 >
} else if < 조건 2 > {
< 조건 2가 참일 때 실행할 구문 >
} else {
< 앞의 조건들을 전부 만족하지 않았을 때 실행할 구문 >
}
else if 구문은 if 절과 함께 사용해야 한다는 점에서 else 절과 비슷하지만 자신만의 조건식을 갖는다는 특성이 있다.
else if 구문은 조건식이 if 조건절을 만족하지 못한 경우에 호출되어 자신의 조건식을 만족하는지 체크한다.
var temperatureInFahrenheit = 90
if temperatureInFahrenheit <= 32 {
print("It's very cold. Consider wearing a scarf.")
} else if temperatureInFahrenheit >= 86 {
print("It's really warm. Don't forget to wear sunscreen.")
} else {
print("It's not that cold. Wear a t-shirt.")
}
// Prints "It's really warm. Don't forget to wear sunscreen."
이 예제에서 else if 구문은 맨 처음의 if 조건절이 참이 아닌 경우에만 체크된다.
즉, temperatureInFahrenheit 변수값이 32보다 작을 경우에만 else if 절로 실행 흐름이 이어진 다는 것이다. 하지만 여기서도 다시 조건식의 값을 체크하여 블록의 실행 여부를 결정한다.
만약 temperatureInFahrenheit 변수의 값이 86보다 크거나 같으면 else if 문 안에 있는 print 문을 출력하고, 그렇지 않다면 else 문에 있는 print 문을 출력하고 종료가 되는 것이다.
else if 구문은 else와 달리 여러 번 사용할 수 있다.
따라서 비교해야 할 값이 여러 개일 때 사용하기 좋다.
else 구문은 앞에서 진행된 if - else if 구문들의 조건 체크가 끝난 후 어느 것에도 속하지 않았을 때에만 실행되어야 하므로 항상 조건문의 맨 마지막에 위치해야 한다.
📝 조건문을 상당히 간결하게 정리할 수 있지
추가 정리
🙂 : else if 구문을 if 구문으로 대체할 수 있지 않냐
중요한 차이가 있다.
컴파일러는 if - else if 구문은 하나의 조건식으로 인식하는 반면, if ~ if ~ 구문은 서로 별개의 조건문으로 인식한다.
따라서 if - else if 구문에서는 차례대로 조건식을 비교하다가 일치하는 것이 발견되면 더 이상 비교를 진행하지 않고 조건문을 종료하지만, if ~ if ~ 구문으로 작성할 경우 이미 일치하는 조건식을 발견하더라도 이에 아랑곳하지 않고 모든 조건식을 비교한 후 구문을 마친다.
📝 컴퓨터 입장에서 불필요한 리소스가 낭비되는 셈!! 매우 좋지 않은 코드이고, 지양해야 합니다 😭😭
동시에 일어날 수 없는 이율배반 사건이라면, 반드시 if - else if 구문을 사용하여 리소스를 절약 ✅
📝 다음은 guard 정리를 해볼께용
📝 2탄 업로드 완료!! guard 구문, #available 구문
Swift 조건문 2
if 구문에 이어서 하는 guard 구문 if 구문이 궁금하면 아래 링크로 가자 !! Swift 조건문 1 다른 말로 분기분(Branch Statements)라고도 불리는 조건문은 프로그램에서 하나 또는 그 이상의 조건값에 따라
sheep1sik.tistory.com
'메모장' 카테고리의 다른 글
Swift 조건문 3 (3) | 2023.03.09 |
---|---|
Swift 조건문 2 (3) | 2023.03.08 |
Swift 타입 추론과 타입 어노테이션 (1) | 2023.03.06 |
Swift 기본 자료형 2 (1) | 2023.03.06 |
Swift 기본 자료형 1 (2) | 2023.03.04 |