이름 값 하는 보디 guard 를 써보자

sonny·2024년 9월 18일
1

iOS 파헤치기

목록 보기
11/12
post-thumbnail

guard

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에는 "멈출 때 해야 할 일"을 적어야 한다.

예시 1

func checkAge(_ age: Int?) {
    guard let validAge = age else {
        print("나이를 입력하지 않았다.")
        return
    }
    print("나이는 \(validAge)살이다.")
}

func checkAge(_ age: Int?)는 나이를 받는 함수.

age는 파라미터 (입력값) 이며, 숫자 또는 nil이 될 수 있다.

guard let validAge = ageagenil이 아니면 값을 validAge에 넣고, nil이면 else 블록을 실행.

만약 agenil이면 else 블록에서 "나이를 입력하지 않았다."라고 출력하고, 함수가 끝난다.또한 agenil이 아니면 "나이는 ~살이다."라고 출력한다. 이렇게 guard 문은 어떤 값이 있는지 확인하고, 없으면 "멈추기" 위해 사용된다.

이 코드에서 elseagenil일 때 어떤 처리를 할지를 명확히 지정하는 역할을 하는데, 만약 else가 없다면, nil일 경우 어떻게 해야 할지를 결정할 수 없기 때문에 오류가 발생하게 된다.

예시 2

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에 대해 알아봤다.

profile
iOS 좋아. swift 좋아.

0개의 댓글