JAVA 좋은 분기문 작성방법


분기문이란?
분기문은 조건문의 한 형태이다.

조건문은 조건에 따라 프로그램의 실행 흐름을 변경하는데 사용된다.
분기문은 조건문 중 하나로, 특정 조건이 충족될 때 프로그램이 다른 명령어나
코드 블록을 실행하도록 하는 역할을 한다.

예를 들어 if문은 가장 간단한 조건문 중 하나이며,
주어진 조건이 true인 경우 특정 코드 블록을 실행하도록한다. 이것이 바로 분기문의 한 예이다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter a number: ");
        int number = scanner.nextInt();

        if (number > 0) {
            System.out.println("Number is positive.");
        } else if (number < 0) {
            System.out.println("Number is negative.");
        } else {
            System.out.println("Number is zero.");
        }
    }
}

여기서 if, else if,else 키워드를 사용하여 조건에 따라 다른 동작을 수행하는 분기문을 정의하고있다.
사용자의 입력한 숫자에 따라 각각 다른 분기로 이동한다.

좋은 분기문(if) 작성법

if문을 작성할때 가장 주의할점은 깊이(depth)이다.

if문을 작성할때는 이중, 삼중, N문 반복문을 가장 피해야한다.
이는 코드 복잡도도 올릴뿐만 아니라 코드에 대한 가독성도 매우 떨어진다.

보호절 숙어(Guard Clause)

Guard Clause은 소프트웨어 개발에서 사용되는 프로그래밍 기법 중하나로,
메서드의 시작 부분에 빠르게 종료 조건을 검사하여 예외적인 상황이나 오류 조건을 빠르게 처리하는 기법이다.

Guard Clause를 사용하면 코드의 가독성을 향상시키고 중첩된 if문을 피할 수 있으며, 코드의 유지 보수성을 향상시킨다.

public int calculateSquare(int number) {
    if (number <= 0) {
        return 0; // 음수 또는 0인 경우 계산하지 않고 0을 반환
    }
    return number * number;
}

Guard Clause를 사용하여 입력된 숫자가 양수인 경우에만 제곱을 계산하는 함수이다.

메서드 시작 부분에서 Guard Clause로 숫자가 0 이하인 경우를 검사하고
해당 조건이 충족되면 계산을 건너뛰고 0을 반환한다.
이로써 음수나 0인 경우에 불필요한 계산을 피하고 원하지 않는 결과를 반환하지 않도록 한다.

다른 예제로 더 공부해보자.

    public void comupter(){
        Server server = getServer();
        if (server != null){
            Client client = server.getClient();
            if(Client != null){
                Request current = client.getRequest();
                if(current != null){
                    //실제 처리할 로직
                }
            }
        }
    }

Guard Clause 적용전

public void computer() {
    Server server = getServer();
    if (server == null) {
        return; // server가 null인 경우 함수 종료
    }

    Client client = server.getClient();
    if (client == null) {
        return; // client가 null인 경우 함수 종료
    }

    Request current = client.getRequest();
    if (current == null) {
        return; // current가 null인 경우 함수 종료
    }
    // 실제 처리할 로직
}

Guard Clause 적용후

각 Guard Clause는 해당 객체가 null인 경우 메서드를 즉시 종료시킨다.
이를 통해 중첩된 if문을 피하고 코드의 가독성을 높일 수 있다. 메서드의 실행 흐름을 더 명확하게 파악할 수 있다.

Loop 문에서 분기 처리

루프 내부의 분기 역시 Guard Clause를 활용하여 처리할 수 있다.

public void processItems(List<Item> items) {
    for (Item item : items) {
        if (item == null) {
            continue; // item이 null인 경우 루프 반복을 건너뛰고 다음 아이템으로 진행
        }
        // 실제 아이템 처리 로직
    }
}

continue 키워드를 사용하여 Guard Clause를 구현 하였다.
루프 내부에서 각 아이템을 검사하고 아이템이 null인 경우에는 continue를 사용하여 현재 반복을 건너뛴다.


가독성을 위한 if문

조건문에서 인수의 순서

좌변에 유동적인 값을 작성하고, 우변에는 상수와 같은 고정값을 기입하도록하자.

if(10 <= length>) 
if(length >= 10)

if/else 블록의 순서

가능한 if에는 긍정의 조건을 넣어야지 가독성이 좋다. 두 블록 중 간단한 블록을 먼저 if문에 작성한다.

if (isEmpty){
    // 간단하고 긍정적인 내용
}else{
    // 빈값이 아니라면,
    // 복잡한 내용
}

복잡한 분기 추출

if(request.user.id == document.owner_id){
    // 사용자가 문서를 수정가능
}

if(request.user.id != document.owner_id){
    // 문서는 읽기 전용이다.
}
final boolean isOwner = isOwner(request, document);
if (isOwner) {
    // 사용자가 이 문서를 수정할 수 있다.
    editDocument();
} else {
    // 문서는 읽기 전용이다.
    viewDocument();
}

// ...

private boolean isOwner(Request request, Document document) {
    return request.user.id == document.owner_id;
}

isOwner 메서드는 사용자가 문서의 소유자인지 확인하는 역할을 한다.
분기내 복잡한 내용을 메서드로 추출하면 가독성이 향상되고 중복 코드가 줄어든다.

조건에 대해 중첩 괄호는 최소화하자.

// if (!(isEmpty && !isRunnable)) { 
//     throw new NotCompletedException();
// }
if (!isEmpty || isRunnable) {
	throw new NotCompletedException();
}

괄호가 적을수록 조건에 대한 가독성이 좋아진다.

참고

배부른코딩로그
DevOOOOOOOOP

최근 포스트

Java 옵셔널 정리

1 분 소요

옵셔널 자바 옵셔널은 Java 8 버전부터 도입된 기능으로 옵셔널을 사용하여 NPE(NullPointerException)을 방지할 수 있다.

Java 객체지향 프로그래밍 정리

6 분 소요

절차지향 프로그래밍 VS 객체지향프로그래밍 프로그래밍 방식은 크게 절차지향 프로그래밍과 객체지향 프로그래밍 2가지 방식으로 나눌 수 있다.

Oracle Profile 공부하기

3 분 소요

오라클 프로파일이란? 오라클 데이터 베이스에서 사용자에 대한 리소스 제어와 권한 관리를 위한 설정을 담당하는 객체이다.

MVC패턴 정복하기

4 분 소요

📌 디자인 패턴 MVC 패턴을 공부하기전에 상위 개념인 디자인 패턴에 대해 알아보자.

JAVA 제네릭 정복하기

5 분 소요

💡 제네릭(Generic)이란 📃 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체 시키는 기능이다.

JAVA 예외(Exception) 정복하기

2 분 소요

자바에서 예외(Exception)는 프로그램의 실행 도중에 발생할 수 있는 비정상적인 상황을 말한다.

JAVA 불변객체

2 분 소요

우아한 테크코스를 진행하면서 불변객체에 대해 많이 접하였습니다. 불변객체에 대한 개념을 공부하기위해 글을작성하였습니다.

JAVA JUnit5 메서드

3 분 소요

자바 테스트 코드작성을 위해 사용되는 Junit5 메소드를 정리해보았습니다.

JAVA JUnit5 어노테이션

7 분 소요

자바 테스트 코드작성을 위해 사용되는 Junit5 어노테이션을 정리해보았습니다.

JAVA 스트림

6 분 소요

자바의정석 책을 참고하여 스트림에 대해 공부한것을 기록하기 위해 작성하였습니다.

객체지향 생활 체조 원칙

9 분 소요

클린 코드는 코드의 가독성, 유지 보수성 및 협업성을 향상시키는 코드를 말한다. 쉽게 말하여 단순히 읽기 쉽고, 각 역할마다 주어진 하나의 일만 담당하며 복잡하거나 모호하지 않은 코드를 말한다.

JAVA 메서드명 네이밍

1 분 소요

코드를 읽는 사람이 코드의 의도를 파악하기 쉽게하며, 코드를 작성한 개발자의 의도를 명확하게 전달하기위해 코드의 네이밍이 중요하다.

JAVA 변수명 네이밍

2 분 소요

사람들은 읽기 좋은 코드를 좋은 코드라고 말한다. 변수, 메소드, 클래스 등의 이름이 일관성이 없고 쓰임을 분명하게 나타내지 않으면 어떨까?