guard 구문은 if 구문과 마찬가지로 조건의 결과가 참인지 거짓인지에 따라 구문의 실행여부를 결정하는 조건문이다. if 구문과의 차이는 guard 구문에는 else 블록이 필수이지만, 조건이 참일 때 실행되는 블록이 따로 없다는 점이다.
guard <조건식 또는 표현식> else {
<조건식 또는 표현식의 결과가 false일 때 실행되는 코드>
}
guard 구문은 주로 후속 코드들이 실행되기 전에 조건을 만족하는지 확인하는 용도로 사용한다. 말하자면 특정 조건을 만족하지 않고 후속 코드를 실행할 경우 오류가 발생할 경우 전체 구문을 조기 종료(Early Exit)하기 위한 목적으로 사용된다는 것이다. 따라서 guard 구문의 else 뒤에는 return, break와 같은 코드의 진행을 막아주는 구문이 반드시 포함되어야 한다.
다음은 0으로 나누면 안되는 숫자의 특성을 guard 구문을 사용해 표현한 예이다.
func divide(base: Int) {
guard base != 0 else {
print("연산할 수 없습니다")
return
}
let result = 100 / base
print(result)
}
divide 함수는 인자값으로 0을 입력받는 경우 guard 구문의 조건을 만족하지 못하게 된다. 이 때에는 else 블록 내부에 작성된 return 구문이 실행되어 "연산할 수 없습니다" 를 출력하고 뒤에 작성된 코드를 실행하지 않은 채로 종료된다.
0이 아닌경우는 guard 구문을 만족하므로 let result = 100 / base와 print(result)구문을 실행하고 구문이 종료된다. guard 구문은 다음과 같이 if 구문으로도 대체가 가능하다
func divide(base: Int) {
if base == 0 {
print("연산할 수 없습니다.")
return
}
let result = 100 / base
print(result)
}
주의해야할 부분은 guard 구문을 if 구문으로 바꿀 경우 조건식이 반대로 바뀐다는 점이다. guard 구문에서는 나누기 연산을 위해 충족되어야 하는 조건을 사용했다면, if 구문에선 연산이 실패할 조건을 사용하여 함수를 종료하도록 처리해야한다.
guard 구문은 실행 흐름을 종료하기 위한 목적으로 사용된느 구문이므로, 코드를 중첩해서 사용하지 않아도 된다는 장점이 있다. 이러한 특성은 전체 코드를 깔끔하고 단순하게 만들어주기 때문에 코딩을 하는데 있어 굉장히 효율성이 올라간다.
다음은 guard 구문을 사용해 인자값을 다양한 조건으로 필터링하는 예시이다.
func divide(base: Int) {
guard base != 0 else {
print("연산할 수 없습니다.")
return
}
guard base > 0 else {
print("base는 0보다 커야합니다.")
return
}
guard base < 100 else {
print("base는 100보다 작아야 합니다.")
return
}
let result = (100 / base)
print(result)
}
이러한 특성 때문에, 조건을 체크해 실행 흐름을 종료시켜야 하는 경우엔 guard 구문을 가급적 사용하는 것이 좋다. 조건을 체크하되 실행흐름을 이어가고 싶은 경우에만 if ~ else 구문을 사용하면된다.
출처 : 꼼꼼한 재은씨의 Swift 문법편
'Swift > 문법' 카테고리의 다른 글
스위프트(Swift) - 조건문 Ⅳ. switch 구문 (0) | 2022.05.03 |
---|---|
스위프트(Swift) - 조건문 Ⅲ. #available 구문 (0) | 2022.05.02 |
스위프트(Swift) - 조건문 Ⅰ. if 구문 (0) | 2022.04.29 |
스위프트(Swift) - 반복문 Ⅱ. while 구문 (0) | 2022.04.28 |
스위프트(Swift) - 반복문Ⅰ. for ~ in구문 (0) | 2022.04.27 |