-
Swift - Conditional Statement (if, switch, guard)Programming/Swift 2020. 9. 29. 02:00
오늘은 Conditional Statement(조건문)에 대해서 공부를 해보겠습니다!
코드를 작성할 때 조건에 따라서 코드를 작성해야 할 때가 많습니다.
이럴 때 사용하는 구문이 Conditional Statement입니다.
오늘은 3가지 조건문에 대해서 공부해보겠습니다.
- If Statement
- Switch Statement
- Guard Statement
If Statement
If 구문에서 가장 간단한 if 구문을 먼저 보겠습니다.
if
condition에는 Boolean Expression이 와야 합니다.
condition을 평가했을 때 true라면 {} 안에 statement를 실행합니다.
false라면 {} 다음 코드를 실행하게 됩니다.
다음 코드에서 myScore가 90보다 크거나 같기 때문에 A가 출력됩니다.
if-else
if else 구문은 condition이 true이면 statements1이 실행되고 false라면 else {} 안에 있는 statemets2가 실행됩니다.
83은 90보다 작기때문에 else 구문이 실행됩니다.
if-elseif
if-elseif 구문은 condition1을 평가한 후에 true가 나오면 statements1을 실행하고 false라면 condition2를 평가하고 true라면 statements2를 실행하는 방식입니다.
else if 는 사이에 공백이 있어야 하며 else if를 원하는 만큼 추가할 수 있습니다.
if-elseif문의 주의할 점
if-elseif문을 사용할땐 조건의 순서가 매우 중요합니다.
위의 예제에서 만약 순서를 반대로 하면 어떻게 될까요??
condition이 true라면 아래 코드는 평가하지 않고 statement를 실행하고 if문은 종료가 됩니다.
이러한 문제로 myScore가 100점임에도 D가 출력됐습니다.
컴파일 오류가 나지는 않지만 논리적인 오류가 발생할 수 있으니 조건의 순서에 유의해야 합니다.
if 중첩
if문은 얼마든지 중첩시킬 수 있습니다.
하지만 중첩이 될수록 코드의 가독성이 떨어지므로 중첩을 많이 시키는 것은 좋지 않습니다.
Switch Statement
if문은 조건으로 경우의 수를 나눴습니다.
이와 다르게 switch문은 value expression이 오고 이 표현식을 case와 매치시켜 경우의 수를 나눕니다.
여기서 주의할 점은 case는 적어도 하나 이상 사용해야 합니다
. 그리고 case를 얼마든지 원하는 만큼 사용할 수 있습니다.
그리고 case와 default 둘 다 한 줄 이상의 실행 가능한 code가 있어야 합니다.
Pattern Matching
이렇게 작성하면 어떻게 될까요??
95점이니까 100과 90 사이인 A가 출력될 거라고 생각하면 틀렸습니다.
여기서 Pattern Matching이 100일 때 A+이고 90일 때 A라면 정확하게 myScore가 100일 때만 A+, 90일 때만 A 그리고 나머지 경우는 F가 출력됩니다.
그렇다면 switch문을 사용할 때는 범위를 어떻게 나타낼까요??
간단합니다. Pattern Matching 대신 Interval Matching을 사용하면 됩니다.
Interval Matching
이렇게 RangeOperator를 사용하여 얼마든지 범위를 매칭 시킬 수 있습니다.
주의할 점으로 case와 default 이후 반드시 실행 가능한 한 줄 이상의 코드를 작성해야 한다고 했습니다.
위 코드에서 A+라는 학점은 없다고 해보겠습니다.
다른 언어에서는 가능한 구문이지만 Swift에서는 에러가 발생합니다.
다른 언어와 같이 100점일 때도 A를 출력하고 싶다면 물론
이렇게 해도 됩니다. 하지만 그렇게 하지 않고 100일 때 아래 case의 code를 실행하고 싶다면
Fallthrough Keyword
이렇게 fallthrough를 사용하면 됩니다.
하지만 fallthrough를 사용할 때도 주의할 점이 있습니다.
바로 아래 case의 pattern과 상관없이 무조건 아래의 코드를 실행시킵니다.
이렇게 myScore가 100이지만 fallthrough 아래의 case의 pattern은 평가하지 않고 code가 실행됩니다.
Guard Statement
Early Exit
guard구문은 if와 비슷한 점이 있습니다. 그리고 얼마든지 guard 구문을 if구문으로 바꿀 수 있습니다.
그렇다면 if구문을 놔두고 왜 guard구문을 사용할까요??
guard구문은 Early Exit를 지원합니다.
Early Exit는 어려운 개념이 아니고 조건에 맞지 않는다면 코드의 블록을 종료하는 것을 말합니다.
그리고 guard구문은 여러 조건이 와도 if처럼 코드의 가독성을 크게 해치지 않습니다.
마지막으로 나중에 함께 공부할 옵셔널 바인딩과 많이 쓰입니다.
사용시 주의해야 할 점
if 구문과 마찬가지로 condition이 옵니다.
condition은 반드시 Boolean Expression이어야 합니다.
condtion이 true라면 else를 건너뛰고 다음 코드를 실행합니다. 그리고 false라면 else {} 구문을 실행하게 됩니다.
주의할 점은 if와 다르게 else를 생략할 수 없습니다.
그리고 else 블록에서는 반드시 코드 블록을 종료하는 코드가 있어야 합니다.
guard구문은 글로벌 스코프에서 혼자 쓰이지 않습니다.
로컬 스코프에서 사용하게 되는데 else문은 해당 로컬 스코프를 종료시킵니다.
위 코드는 숫자를 받아서 0보다 크거나 같다면 true를 리턴하고 아니면 false를 리턴하고 함수를 종료시킵니다.
사실 guard 구문은 이런 식으로는 잘 사용하지 않습니다.
주로 옵셔널 바인딩과 함께 사용하게 됩니다.
옵셔널 바인딩에 대해서는 옵셔널에서 자세히 공부하겠습니다.
이렇게 , (comma)로 얼마든지 조건을 여러 개 정할 수 있습니다.
조건이 하나라도 만족하지 않는다면 else구문이 실행됩니다.
Value Binding Pattern
Value Binding Pattern은 switch문에서 주로 사용되며 이때 where 절을 이용하여 조건을 추가하여 사용하게 됩니다.
자세한 내용은 다음에 공부하도록 하고 간단하게 코드만 보겠습니다. 지금 이해하기에는 어려울 수 있습니다.
case 다음에 값이나 범위가 온 게 아니라 let x where x.isMultiple(of: 2)가 왔습니다.
이 코드의 의미는 상수 x를 생성하고 intNum의 값을 x에 할당합니다. 그리고 이 값이 2의 배수인지 확인하고 있습니다.
where은 조건을 추가하는 키워드입니다.
where 뒤에는 반드시 Boolean Expression이 와야 하고 조건이 true로 평가되면 case 구문이 실행됩니다.
이렇게 case에 임시로 상수나 변수를 선언하고 value를 할당하는 것을 Value Binding이라고 합니다.
이때 바인딩된 x는 case 구문 안에서만 사용할 수 있습니다.
이렇게 얼마든지 let을 var로 선언할 수 있습니다.
하지만 바인딩한 x는 해당 case에만 사용됩니다.
default에서 x의 값을 바꾸려 하니 x를 찾을 수 없다는 에러가 발생합니다.
참고자료
https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Control Transfer Statements (0) 2020.10.01 Swift - Loop Statements (0) 2020.09.30 Swift - Operator 종류 (0) 2020.09.28 Swift - Operator 기본 (0) 2020.09.28 Swift - Type Safety, Type Alias, Type Conversion, Type Casting (0) 2020.09.20