guard
는 조건을 체크하고 그 조건이 충족되지 않을 경우 코드 블록을 빠져나가는 데 사용되는 Swift의 키워드이다.
아 그리고 guard는 키워드
라고 한다. 함수나 메서드가 아니라 Swift에서 조건을 확인할 때 사용하는 특별한 문법 요소이기 때문에 if
처럼 조건을 체크하지만, guard
는 조건이 맞지 않을 때 미리 빠져나가도록 만드는 데 주로 사용해서 메서드가 아닌 키워드로 불린다고 한다.
guard
를 사용하면 코드의 가독성을 높이고 조건이 충족되지 않을 경우 바로 함수를 종료할 수 있어 불필요한 들여쓰기를 줄일 수 있다. 보통 함수의 초반에 입력 값이 적절한지 체크하거나, 옵셔널 값을 안전하게 추출할 때도 사용된다.
guard
문은 항상 else
와 함께 사용해야 하며, 조건이 충족되지 않을 경우 else
블록 안에 있는 코드를 실행한다. 보통 else
블록에서는 return
, break
, continue
, throw
같은 코드가 포함되어야 한다.
항상 else
와 함께 사용해야 하는 이유는 더 자세히 설명하자면 guard
가 조건을 확인하고, 그 조건이 맞지 않을 때 어떻게 할지 정해주어야 하기 때문이다.
else
블록은 "조건이 맞지 않을 때" 실행할 코드를 넣는 곳이다. guard
문에서는 조건이 맞지 않을 때, 보통 그 시점에서 함수나 반복문을 끝내고 싶어 한다. 그래서 else
안에는 주로 다음과 같은 코드를 넣는다:
return
: 함수를 바로 끝낸다.break
: 반복문을 중단한다.continue
: 반복문에서 다음 반복으로 넘어간다.throw
: 에러를 발생시킨다.정리하자면 guard
는 "조건을 확인하는 문장"이다. 만약 그 조건이 맞지 않으면, 더 이상 코드를 실행하지 않고 빠져나가게 한다. 그리고 guard
를 쓰면 코드를 더 깔끔하고 이해하기 쉽게 만들 수 있다.
guard
는 "이게 아니면 여기서 멈춰라. "라고 말하는 것과 같다. guard
뒤에는 항상 else
가 따라와야 하며, else
에는 "멈출 때 해야 할 일"을 적어야 한다.
func checkAge(_ age: Int?) {
guard let validAge = age else {
print("나이를 입력하지 않았다.")
return
}
print("나이는 \(validAge)살이다.")
}
func checkAge(_ age: Int?)
는 나이를 받는 함수.
age
는 파라미터 (입력값) 이며, 숫자
또는 nil
이 될 수 있다.
guard let validAge = age
는 age
가 nil
이 아니면 값을 validAge
에 넣고, nil
이면 else
블록을 실행.
만약 age
가 nil
이면 else
블록에서 "나이를 입력하지 않았다."
라고 출력하고, 함수가 끝난다.또한 age
가 nil
이 아니면 "나이는 ~살이다."
라고 출력한다. 이렇게 guard
문은 어떤 값이 있는지 확인하고, 없으면 "멈추기" 위해 사용된다.
이 코드에서 else
는 age
가 ni
l일 때 어떤 처리를 할지를 명확히 지정하는 역할을 하는데, 만약 else
가 없다면, nil
일 경우 어떻게 해야 할지를 결정할 수 없기 때문에 오류가 발생하게 된다.
func greetUser(name: String?) {
guard let userName = name else {
print("이름이 입력되지 않았다.")
return
}
print("안녕하세요, \(userName)님!")
}
두번 째 예시까지 보니 이해가 잘 된다.
guard
는 예를 들어 회원가입 같은 상황에서 반드시 입력해야 하는 값을 체크할 때 자주 사용될 것 같다. 예를 들어 회원가입할 때 이름
, 이메일
, 비밀번호
같은 정보를 입력해야 할 때 guard
를 사용해 각 입력 값이 있는지 확인하고, 없으면 함수를 종료해 오류 메시지를 보여주는 데 유용할 것 같다.
예시를 보다가 궁금한 게 있어서 추가로 알아 본 부분도 메모해놓겠다.
예시들을 보면 대부분 첫 줄에 (_ age: Int?)
,(_ number: Int?)
,(name: String?)
이렇게 있는데
(_ ㅇㅇㅇ: Int?)
부분은 함수에 전달할 입력값, 즉 "파라미터"를 정의하는 부분이고, 이 부분을 통해 함수가 외부에서 값을 받을 수 있다고 한다.
number: Int?
는 함수에 전달할 값의 이름
과 자료형
을 나타내고, 여기서 number
는 파라미터의 이름, Int?
는 그 값이 정수
이거나 nil
일 수 있다는 의미.
_
는 이 함수를 호출할 때 파라미터 이름을 생략할 수 있게 해준다고 한다. 예를 들어, checkNumber(5)
라고만 쓰면 되며, _
가 없으면 checkNumber(number: 5)
라고 써야 한다.
이렇게 함수를 만들어두면 필요한 상황에서 언제든지 그 함수를 호출해 사용할 수 있는데, 예를 들어 숫자를 확인하는 작업이 여러 곳에서 필요하다면, checkNumber
함수를 사용하면 된다고 한다.
감시역할을 하고 제재시키는 보디가드 같은 guard
에 대해 알아봤다.