아래의 글을 먼저 읽고 오면 좋다.
guard문
// Syntax
guard condition else {
statements
}
- 다른 조건문들과 마찬가지로 condition을 평가한 뒤 코드를 실행한다.
- condition에는 bool 타입의 표현식이 와야 한다.
- guard에서는 else 블럭을 비워둘 수 없다.
condition이 true일때.
guard문을 종료하고 뒤에 있는 코드를 계속해서 실행한다.
(뒤에 있는 코드가 무엇인지는 예시를 볼때 이해할 수 있을 것이다.)
condition이 false일때
else문을 실행.
하지만 else문에는 두가지 조건이 있다.
- 생략불가
- else 블록 안에서 반드시 scope를 종료해야 함. (ex// return)
코드구현
위의 설명들을 이해하기 위해서 코드를 구현해보자.
func checkLength(length: String) {
guard length.count >= 5 else {
print("too short")
return
}
print("enough length")
}
checkLength(length: "Hi") //"too short"
checkLength(length: "Hello") //"enough length"
가드문은 일종의 관문같은 느낌이라고 보면 된다.
혹은 마치 VIP을 지키는 보디가드 같은 느낌이라고 보면 된다.
누군가 VIP에게 접근하기전, 보디가드의 검증을 먼저 거치듯이, 가드문의 검증을 먼저 거친다.
코드를 해석해보자.
checkLength라는 함수를 만들었다.
파라미터로는 length를 만들었고, 타입은 String이다.
length의 길이를 재서, 5글자 이상이라면,
가드문은 종료되고, "enough length"를 출력한다.
만약 5글자 이하라면,
"too short"를 출력하고 함수 checkLength 자체가 종료된다.
즉 위의 설명에서 말한 뒤에 있는 코드는, 함수 안의 가드문 다음에 있는 코드들을 말하는 것이다.
이래서 보디가드를 예시로 든 것이다.
print("enough length")
이 코드가 VIP에 해당한다.
보디가드(가드문)의 검증을 통과한다면(true라면) -> VIP에 접근할 수 있다.(가드문 밖에 있는 코드 실행)
보디가드(가드문)의 검증을 통과하지 못한다면(false라면) -> VIP에 접근할 수 없다.(가드문뿐만 아니라, 함수 자체가 종료)
가드문을 응용해보자.
func baechu(age: Int) {
guard age >= 5 else {
print("too young")
return
}
guard age <= 15 else {
print("old age")
return
}
print("good age")
}
baechu(age: 4) //"too young"
baechu(age: 16) //"old age"
baechu(age: 10) //"good age"
func mungchi(age: Int) {
guard age >= 5 && age <= 20 else {
print("not a good age")
return
}
print("good age")
}
mungchi(age: 9) //"good age"
mungchi(age: 21) //"not a good age"
Early Exit
condition이 false면 뒤에 이어지는 코드를 실행시키지 않고 종료시킬 수 있는데,
이를 Early Exit라고 한다.
Early Exit의 예시를 보자.
func baechu(age: Int) {
guard age < 10 else {
return
}
print("Still Young!")
print("Still Young!!")
print("Still Young!!!")
print("Still Young!!!!")
print("Still Young!!!!!")
}
baechu(age: 11) //가드문 및 함수 종료
만약 가드문의 condition이 false일 경우, 별다른 코드 없이 return만을 입력한 경우,
이어지는 코드들이 실행되지 않고 바로 해당 함수는 종료된다.
번외
위에 예시로 든 guard문을 if문으로 바꾸면 어떻게 될까?
func baechu(age: Int) {
guard age >= 5 else {
print("too young")
return
}
guard age <= 15 else {
print("old age")
return
}
print("good age")
}
baechu(age: 4) //"too young"
baechu(age: 16) //"old age"
baechu(age: 10) //"good age"
이 코드를 if문으로 바꿔보자.
func baechu(age: Int) {
if age >= 5 {
if age <= 15 {
print("good age")
} else {
print("old age")
}
} else {
print("too young")
}
}
baechu(age: 4) //"too young"
baechu(age: 16) //"old age"
baechu(age: 10) //"good age"
위의 예시들은 간단한 코드이기 때문에 별 차이가 없어보이지만,
코드에 따라서, 같은 코드를 각각 guard문과 if문으로 구현했을때, 가독성의 차이가 심하게 벌어질 경우가 있을 수도 있다.
예를 들면 if문의 지나친 중첩으로 가독성이 떨어진다랄지 말이다.
위의 짤처럼 Pyramid of Doom이 펼쳐질 수도 있다.
'Language > Swift' 카테고리의 다른 글
Swift 기본 문법 - Range Operator(범위 연산자) (0) | 2024.10.19 |
---|---|
Swfit 기본 문법 - 조건문 switch문 (0) | 2024.10.19 |
Swift 기본 문법 - 조건문 if문 (2) | 2024.10.14 |
Swift 기본 문법 - 할당 연산자(Assignment Operator) (0) | 2024.10.14 |
Swift 기본 문법 - Ternary Operator (삼항연산자, 조건연산자) (0) | 2024.10.12 |
살아남는 iOS 개발자가 되기 위해 끊임없이 노력하고 있습니다.