-
[Swift] guard가 if보다 나은 이유?앱등이에게 살충제를 뿌린다./Swift 2015. 11. 10. 22:58
<No1 가드, 송태섭>
Swift 2.0에 guard가 등장했다.
이 놈이 평범한 if문보다 어떤 강점이 있는걸까?
복잡도를 최소화해보자.
조건문은 모든 프로그래밍 언어에서 기본적으로 갖추고 있는 요소입니다. Obj-C도 Swift도 예외는 아닙니다. 어떤 애플리케이션을 만들더라도 조건문에 의한 복잡도를 벗어나는 완벽한 방법은 없을 것입니다.
불행히도, 조건문은 종종 복잡도를 높이는 원인이 되곤 합니다. 촘촘히 쓰여진 조건문은 디버깅의 방해요소가 되기도합니다. 촘촘한 if문을 피하기 위해서 아래와 같은 방법을 사용하기도 했어요.
이 코드의 목적은 가능한 빨리 메소드를 종료시키는데에 있습니다. 이 메소드 내에서 if는 특정한 조건이 만족될 때, 메소드의 다른 부분을 철저히 무시하고 종료시키는데에 도움을 주고 있습니다.
위와 똑같은 역할의 코드는 아래처럼 쓰여질 수도 있겠네요.
이 코드의 문제점이 느껴지시나요? 우린 벌써 어떤 의미도 없는 2 depth의 if문을 써버렸습니다.
Swift에서는 더 편하게 써볼 수 있습니다. 문법은 비슷해보입니다. 하지만 customers가 optional하기 때문에 unwrap하고 사용해줍니다.
Exit Early
Swift 2.0에서는 guard문이 등장합니다. 함수, 메소드를 좀 빨리 종료시키기 위해 탄생되었죠. guard문은 촘촘하고 깊은 depth의 조건문들을 없애버리는데에 아주 용이합니다. 이 guard의 유일한 목적이 바로 조건의 set을 검사하는데에 있죠. 아래 예를 보시면 위의 예제의 if를 모두 guard로 바꿔주었습니다.
guard 구문에 대한 얘기를 해보죠.
Syntax
guard는 우리가 어떠한 조건의 검사를 하는 것을 강조하고 있습니다. 무언가를 정말 guard하는 거죠. 이 예제에서는 rechable과 connected가 true인지를 체크하고 있죠. true가 아니라면 메소드가 그 즉시 종료하게 됩니다. 요점은 guard가 일반 if문에 비해서 좀더 조건검사에 있어서 명료한 구문이라는 점입니다.
Exit
guard구문은 항상 else구문이 따른다는 점을 생각해봅시다. else문은 guard문이 false일때만 실행이 됩니다. 이 또한 guard가 조건검사에 있어서 명료함을 보태는 점이라고 할 수 있습니다.
else구문에서는 guard가 있는 scope에서 벗어나는 영역의 컨트롤을 해주어야 합니다. 예제에서는 return을 하고 있습니다. 그 외에도 반복문에서 사용되었다면 continue를 사용해줄 수도 있고, error를 throw해줄 수도 있습니다. 아래 예제에서는 else문 내에서 error를 throw하고 있습니다.
Powerful
guard문은 정말 if문 만큼이나 강력합니다. optional binding 또는 where구문까지도 사용이 가능합니다. 위 예제가 정말 불필요한 조건문들이 붙는것보다 가독성이 좋다는데에 동의하실겁니다.
Scope
if문과의 주요한 차이점중 하나는 optional binding을 사용하는 변수와 상수의 scope입니다. 위의 예에서 customers 상수는 optional binding을 사용하여 할당되었습니다. 이 customers상수는 guard가 나타나는 scope내부에서 사용이 가능합니다. 이 것이 guard의 유용한 장점중 하나입니다.
Conclusion
만약 guard문이 if문의 다른 버전이라고 생각하셨다면 그 생각이 바뀌길 바랍니다. if가 정말 대부분의 상황에 사용되겠지만 guard 또한 특정 상황에서는 수 많은 장점을 지닙니다. Swift 2에서 소개된 error handling과 함께 사용된다면 정말 힘을 발휘할겁니다.
출처 : http://code.tutsplus.com/tutorials/swift-20-exit-early-with-guard--cms-24326
소감 : guard를 왜쓰는지 모르겠어서 봤는데.. 역시 왜쓰는지 모르겠다.
'앱등이에게 살충제를 뿌린다. > Swift' 카테고리의 다른 글
[Swift] static 함수와 class 함수! static func vs class func (7) 2016.07.20 [Swift] String의 subString을 subscript로 구현해보자. (0) 2016.05.01 [Swift] Objective-C 오픈소스(AFNetworking 2.0)를 Swift에 적용시켜보자 (0) 2016.03.21 [Swift] 타입 캐스팅 (0) 2015.12.22 [Swift] Set(집합)이라는 컬렉션 (0) 2015.11.11