이 포스트는 야곰님의 Swift 프로그래밍 2판을 보고 스스로 공부한 내용을 정리한 포스트 입니다.


예제 코드


참고 자료


빠른종료 (Early Exit)

  • '빠른종료(Early Exit)'의 핵심 키워드는 'guard'이다.

  • guard 구문은 if 구문과 유사하게 Bool 타입의 값으로 동작하는 기능이다.

  • if 구문과는 다르게 guard 구문은 항상 else 구문이 뒤에 따라와야 한다.

  • 만약 guard 뒤에 따라오는 Bool 값이 false라면 else의 블록 내부 코드를 실행하게 되는데, 이때 else 구문의 블록 내부에는 꼭 자신보다 상위의 코드 블록을 종료하는 코드가 들어가게 된다.

    • 그래서 특정 조건에 부합하지 않는다는 판단이 되면 재빠르게 코드 블록의 실행을 종료할 수 있다.

    • 이렇게 현재의 코드 블록을 종료할 때는 return, break, continue, throw 등의 제어문 전환 명령을 사용한다. 또는 fatalError()와 같은 비반환 함수나 메서드를 호출할 수도 있다.

guard Bool 타입  else {
    예외사항 실행문
    제어문 전환 명령어
}
  • guard 구문을 사용하면 if 코드를 훨씬 간결하고 읽기 좋게 구성할 수 있다.

  • if 구문을 사용하면 예외사항을 else 블록으로 처리해야 하지만 예외사항만을 처리하고 싶다면 guard 구문을 사용하는 것이 훨씬 간편하다.

guardSyntaxExampleImage-1

  • 위의 코드는 같은 기능을 수행하는 if 구문과 guard 구문의 비교이다.

guardSyntaxExampleImage-2

  • Bool 타입의 값으로 guard 구문을 동작시킬 수 있지만 옵셔널 바인딩의 역활도 할 수 있다.

  • guard 뒤에 따라오는 옵셔널 바인딩 표현에서 옵셔널의 값이 있는 상태라면 guard 구문에서 옵셔널 바인딩된 상수를 guard 구문이 실행된 아래 코드부터 함수 내부의 지역상수처럼 사용할 수 있다.

  • 위의 코드에서 guard를 통해 옵셔널 바인딩 된 상수는 greet(_:) 함수 내에서 지역상수처럼 사용된 것을 볼 수 있다.

optionalChainingImage-12

  • 위의 코드는 옵셔널 체이닝에서 작성했던 코드이다.

  • 위의 코드에서 작성했던 Address 구조체의 fullAddress() 메서드를 guard 구문을 이용하여 조금 수정해보자.

guardSyntaxExampleImage-3

  • 위의 코드를 보면 기존에 사용했던 if let 바인딩보다는 조금 더 깔끔하고 명료하게 사용한 것을 볼 수 있다.

guardSyntaxExampleImage-4

  • 조금 더 구체적인 조건을 추가하고 싶다면 쉼표(,)로 추가조건을 나열해주면 된다.

    • 추가된 조건은 Bool 타입 값이어야 한다.

    • 또, 쉼표로 추가된 조건은 AND 논리연산과 같은 결과를 준다. 즉, 쉼표를 &&로 치환해도 같은 결과를 얻을 수 있다는 뜻이다.

guardSyntaxExampleImage-5

  • guard 구문의 한계는 자신을 감싸는 코드 블록, 즉 return, break, continue, throw 등의 제어문 전환 명령어를 쓸 수 없는 상황이라면 사용이 불가능하다는 점이다.

  • 함수나 메서드, 반복문 등 특정 블록 내부에 위치하지 않는다면 사용이 제한된다.