if-else 문은 프로그래밍 할때 제일 기초로 배우고 사용하는 분기문 입니다.
혼자 프로그래밍을 할때는 그저 남발하며 사용하다가, 실무 프로젝트에 코드들을 보면 "아 내 코드는 아주 지저분 했구나" 를 알 수 있었습니다.
그러면 if 문을 효율적이고 가독성 있게 사용하는 방법은 무엇일까?
실무 프로젝트에 리팩토링 되어있는 코드를 보고 느낀, 고려하면 좋은 3가지 개념에 대해 기술하겠습니다.
1. Guard clause
if-else 이 중첩(nested)되어있으면 코드가 복잡해 지고, 가독성이 낮아집니다.
code depth가 깊어지는 것을 막기위해 Guard clause를 고려하여 코딩을 하면 좋습니다. == code 가 평탄화 된다. (code flatterd)
1.1 Guard clause 는 무엇인가 ?
메서드나 함수에서 특정 조건을 빠르게 확인하고, 해당 조건이 참일 때 즉시 리턴하거나 예외를 던지며, 그 뒤의 코드 실행을 방지하는 패턴입니다. 이 방법은 코드의 가독성을 높이고, 깊게 중첩된 조건문을 피하는 데 유용합니다.
- Clean Code (클린 코드): Guard clause라는 용어는 로버트 C. 마틴(Robert C. Martin)이 저술한 책 Clean Code에서 널리 알려지게 되었습니다. 이 책에서는 코드를 더 읽기 쉽고, 유지보수하기 쉽게 만드는 여러 가지 원칙을 설명하고 있으며, Guard clause는 이러한 원칙 중 하나로 소개됩니다. 로버트 마틴은 코드에서 불필요한 복잡성을 피하고, 가능한 한 코드를 단순하게 유지할 것을 강조합니다.
중첩된 if 문 코드
function getPayAmount() {
let result;
if (isDead)
result = deadAmount();
else {
if (isSeparated)
result = separatedAmount();
else {
if (isRetired)
result = retiredAmount();
else
result = normalPayAmount();
}
}
return result;
}
평탄화된 if 문 (Guard clause) 코드
function getPayAmount() {
if (isDead) return deadAmount();
if (isSeparated) return separatedAmount();
if (isRetired) return retiredAmount();
return normalPayAmount();
}
- 조건의 조기 종료:
- 각 조건을 검토하여 조건이 만족되는 경우, 즉시 관련된 지불 금액을 반환합니다. 조건이 만족되지 않는 경우에만 다음 조건이 평가됩니다.
- 단순화된 코드:
- 중첩된 if-else 구조 없이, 조건에 따라 필요한 지불 금액을 빠르게 반환합니다. 이는 코드의 가독성을 높여주고, 유지보수를 더 쉽게 합니다.
- 조건이 충족되지 않을 경우의 기본값:
- 모든 조건이 false인 경우, 기본 지불 금액을 반환합니다.
2. 삼항연산자 이용하기
삼항 연산자는
조건문 ? 실행식 1 : 실행식 2
조건문이 참일 경우 실행식1이 실행되고, 조건문이 거짓일 경우 실행식2가 실행됩니다.
if-else 문 보다 삼항 연산식을 사용하면 코드를 좀 더 간결하게 만들 수 있습니다.
if 문 예시 코드
Integer page;
if (requestBody.getPage() != null) {
page = requestBody.getPage();
} else {
page = 1;
}
삼항 연산식으로 바꾼 코드
Integer page = requestBody.getPage() != null ? requestBody.getPage() : 1;
하지만 삼항 연산식을 여러개 중첩하거나 복잡한 로직을 추가하면 오히려 가독성이 떨어질 수 있습니다. 간단한 조건을 처리할 때는 유용하지만 복잡한 로직을 개발할때는 'if' 문을 이용하면 좋습니다.
3. if 문 조건식에 if (isTempTrue == false) 보단 if(!isTempTrue)
boolean isTempTrue = false;
if (isTempTrue == false) {
// 이 블록은 isTempTrue가 false일 때 실행됩니다.
}
boolean isTempTrue = false;
if (!isTempTrue) {
// 이 블록은 isTempTrue가 false일 때 실행됩니다.
}
아래 코드가 불필요한 비교 연산자 없이 논리 부정 연산자 하나로 상태를 확인할 수 있습니다. 더 간결하고 직관적입니다.
피드백 환영입니다. 다른 의견도 알려주세요
참고 문헌
https://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html
Replace Nested Conditional with Guard Clauses
Replace Nested Conditional with Guard Clauses function getPayAmount() { let result; if (isDead) result = deadAmount(); else { if (isSeparated) result = separatedAmount(); else { if (isRetired) result = retiredAmount(); else result = normalPayAmount(); } }
refactoring.com
'백엔드 back-end' 카테고리의 다른 글
[JAVA] Logger 선언: 정적(static) vs 인스턴스(instance) 방식의 차이, 권장방법? (1) | 2024.10.25 |
---|---|
[Spring] DTO & Entity 차이, 분리이유 ? (0) | 2024.09.25 |
[Spring] @Value 어노테이션 값에 빨간줄 뜨는 이유? / 인식오류/ 해결방법 (0) | 2024.08.13 |
[JPA] 엔티티 클래스 테이터 타입 int, Integer 차이점/ null 값 오류 해결방법 (0) | 2024.08.05 |
[Spring] @Controller & @RestController 차이/ 함께 사용가능? / 사용하는 이유? (0) | 2024.07.23 |