Search
Duplicate

Swift에서 if 와 guard중에 뭘 써야하나...

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Swift
Scrap
태그
swift
swift docs
9 more properties
swift를 공부하면 if를 사용해야 할지 guard를 사용해야 할지 고민하는 순간이 종종 생긴다.
그래서 둘의 차이를 알아보았다.

1. 글 요약

1.
if와 달리 guard는 항상 else문을 가진다.
2.
guard의 else문에서는 return(혹은 break, continue, throw)으로 즉시 종료시킨다.
3.
이것은, 코드의 가독성을 높인다. (웬만하면 guard써라!)

2. 공식 문서

스위프트 공식 문서를 살펴보면 guard 와 if 의 차이를 guard는 항상 else문을 갖는 것이라고 설명한다.
그러면서 guard의 else문(조건이 만족되지 않았을 때 실행됨)은 guard가 있는 코드블록을 return, break, continue, throw를 이용해서 즉시 exit시켜야 한다고 강조한다. 리턴을 하지 않는 fatalError(_:file:line:)를 이용해 exit시킬 수도 있다고 한다.
예제 코드를 살펴보자.
17번째 줄 Ex.1에서는 name은 존재하나(2번째 줄의 guard 조건문 만족O) location이 존재하지 않기 때문에(8번째 줄의 guard 조건문을 만족X) else문이 실행되어 문장 (A) I hope the weather is nicer near you. 가 출력되었다. 그리고 return을 통해 프로그램이 즉시 종료되었다.
19번째 줄 Ex.2에서는 name도 존재하고(2번째 줄의 guard 조건문 만족O) location도 존재하기 때문에(8번째 줄의 guard 조건문 만족O) else문을 뛰어넘어 문장 (B) I hope the weather is nice in Cupertino. 가 출력되었다.

3. Guard 사용의 이점

if 대신 guard를 사용하는 것은
(1) 조건문을 만족하지 않을 때 처리가 확실하다.
(2) guard문의 사용 형태는 코드의 가독성을 높인다.
(1) 의 상황은 예외처리를 할 때 강력하다. else문을 강제하기 때문에 예외처리 시에는 보통 guard를 사용한다.
(2) 는 굉장한 장점이다. 내가 쓰지 않은 코드를 읽는 것은 쉬운 일이 아니기 때문에 가독성을 높여준다는 것은 읽는 사람에게 큰 도움을 준다.
if는 else문을 강제하지 않기 때문에, 두 가지 형태로 사용할 수 있다.
guard는 else문을 강제하기 때문에 이 형태로만 사용할 수 있다.
이렇게만 보면 if와 guard의 가독성이 크게 달라보이지 않을 수도 있지만 엄청나게 긴 코드라고 생각해보면 상황은 달라질 수 있다.
코드가 긴 아래와 같은 상황을 가정해보자.
if문 예시
일단 if문을 만나면
(1) 조건문을 읽어야 한다.
(2) 조건문을 만족하는 경우가 일반적인지 판단해야 한다.
(3) 만족한다면 어떻게 실행되는지 확인한다.
(4) else문이 있는지 확인한다.
(5) 조건문을 불만족해서 else문이 실행된다면 어떻게 실행되는지 확인한다.
이러한 과정을 거쳐야 한다.
반면 guard문을 만나면
guard문 예시
(1) 조건문을 읽는다. (조건문을 만족하지 않는 경우는 예외적인 경우이므로 읽지 않아도 된다.)
(2) else문을 뛰어넘어 바로 조건문 만족시 실행되는 코드 부분을 읽는다.
guard문은 조건문의 만족/불만족에 따른 결과처리에 크게 집중하지 않고 코드를 읽어나갈 수 있다.
즉, 조건문을 만족하는 경우와 불만족하는 경우가 1:1로 발생하는 상황을 제외하고는, guard 를 사용하는 것이 훨씬 유리하다. (보통은 조건문을 사용할 때 많이 발생하는 경우를 조건을 충족하는 쪽으로 두기 때문)
이 아래부터는 @Jeong YunWon 멘토님의 조언을 받아 수정하였습니다.
코드를 전체적으로 보았을 때, 메인 로직이 어느것이냐에 따라 (발생빈도는 낮더라도) 조건문을 정의할 수 있다.
잔여백신 예약 매크로를 만든다고 가정해보자.
잔여백신이 있으면 → 매크로를 실행시켜 예약한다. 잔여백신이 없으면 → 매크로 실행 없이 종료한다.
Markdown
복사
우리가 의도한 프로그램에서 메인 로직은 잔여백신이 있으면 매크로를 실행시켜 예약한다. 이다.
잔여백신이 있는 상황이 발생빈도는 낮더라도 조건문 자리에 들어가는 것이 더 좋은 코드라고 할 수 있다.
메인 로직을 중시해서 조건문을 만든다면, 아래 함수와 같은 형태가 될 것이다.
참고: