[리팩토링] if-statemets 를 효율적이고 가독성있게 사용하는 방법 3가지

2024. 8. 20. 14:22·백엔드 back-end

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
'백엔드 back-end' 카테고리의 다른 글
  • [JAVA] Logger 선언: 정적(static) vs 인스턴스(instance) 방식의 차이, 권장방법?
  • [Spring] DTO & Entity 차이, 분리이유 ?
  • [Spring] @Value 어노테이션 값에 빨간줄 뜨는 이유? / 인식오류/ 해결방법
  • [JPA] 엔티티 클래스 테이터 타입 int, Integer 차이점/ null 값 오류 해결방법
니블
니블
  • 니블
    기록장
    니블
  • 전체
    오늘
    어제
    • 분류 전체보기 (89)
      • 카프카 Kafka (2)
      • 데이터베이스 db (3)
      • 깃 git (4)
      • 백준 baekjoon (31)
      • 백엔드 back-end (20)
      • 점프 투 스프링부트 (8)
      • 메세지 큐 mq (3)
      • 개발도구 tool (3)
      • 레디스 Redis (3)
      • CI-CD (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리베이스
    GitLab
    이벤트스트리밍
    백준
    자바
    사용자이름
    분산처리
    heapq
    EC2
    로거
    Docker
    mysql
    rebase
    분산구조
    pipelines
    메세지큐
    SQUASH
    gitconfig
    Git
    1927
    트러블슈팅
    레디스 클러스터
    redis
    guard clause
    kafka
    docker runner
    db
    스프링부트
    reids-cluster
    AWS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
니블
[리팩토링] if-statemets 를 효율적이고 가독성있게 사용하는 방법 3가지
상단으로

티스토리툴바