[Java] 코드를 더 깔끔하고 효율적으로: Depth 줄이기와 변수 선언 최적화

민경담·2024년 7월 30일

자바 리팩토링

목록 보기
3/6
post-thumbnail

들어가며

Java 코드를 작성하다보면, 깊이 있는 중첩 반복문이나 조건문으로 인해 코드의 가독성이 떨어지고 유지보수가 어려운 경우가 많습니다.

이러한 문제를 해결하기 위해 메서드 추출변수 선언 최적화 를 통해 코드를 더 깔끔하고 효율적으로 만드는 방법에 대해 알아보겠습니다.

메서드로 추출하여 Depth 줄이기

중첩 반복문이나 조건문은 코드의 깊이를 증가시켜 가독성을 떨어뜨립니다.

이를 해결하기 위해 메서드를 추출하여 코드를 단순화하고, 추상화를 통해 논리적인 구조를 개선할 수 있습니다.

아래의 코드는 중첩 반복문과 조건문이 있는 코드의 예시입니다.
이중 for문을 활용하여 인덱스 값이 홀수, 짝수인 경우의 값을 달리 콘솔에 출력합니다.

public class Main {
    public static void main(String[] args) {
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                if (matrix[i][j] % 2 == 0) {
                    System.out.println(matrix[i][j] + " is even.");
                } else {
                    System.out.println(matrix[i][j] + " is odd.");
                }
            }
        }
    }
}

위의 코드를 메서드를 추출하여 리팩토링한 예시를 알아보겠습니다.

public class Main {
    public static void main(String[] args) {
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };

        printMatrixParity(matrix);
    }

    // 행렬의 요소가 짝수인지 홀수인지 출력하는 메서드
    private static void printMatrixParity(int[][] matrix) {
        for (int[] row : matrix) {
            printRowParity(row);
        }
    }

    // 행의 요소가 짝수인지 홀수인지 출력하는 메서드
    private static void printRowParity(int[] row) {
        for (int value : row) {
            printValueParity(value);
        }
    }

    // 요소가 짝수인지 홀수인지 출력하는 메서드
    private static void printValueParity(int value) {
        if (value % 2 == 0) {
            System.out.println(value + " is even.");
        } else {
            System.out.println(value + " is odd.");
        }
    }
}

위의 리팩토링한 코드를 파악해보겠습니다.

  1. 기능별로 메서드 추출

    1. 행렬의 요소를 출력하는 기능을 printMatrixParity 메서드로 추출했습니다.
    2. 행의 요소를 출력하는 기능을 printRowParity 메서드로 추출했습니다.
    3. 요소가 짝수인지 홀수인지 판단하고 출력하는 기능을 printValueParity 메서드로 추출했습니다.
  2. 추상화

    각 메서드는 자신을 역할을 명확히 하며, 상위 메서드는 하위 메서드를 호출하여 처리합니다.

  3. Depth 감소

    중첩된 반복문과 조건문을 메서드로 분리하여 Depth를 줄여, 코드의 논리적 구조를 개선하여 이해하기 쉽게 만들 수 있습니다.

메서드로 추출하여 Depth 줄일 때 유의점 ❗

💡 무조건 1 Depth로 만들어라는 아니다.

즉, 보이는 depth를 줄이는 데 급급하는 것이 아닌, 추상화를 통한 사고 과정의 depth를 줄이는 것이 중요하다.

만약, 2중 중첩 구조를 표현하는 것이 사고하는 데에 더 도움이 된다고 판단된다면,
메서드 분리보다 그대로 놔두는 것이 더 나은 선택일 수 있다. 때로는 메서드를 분리하는 것이 혼선을 야기할 수 있다는 점은 생각해야한다.

사용하는 변수는 선언과 가까이 하여 사용한다.

변수 선언을 사용한 곳과 가깝게 위치시키면 코드의 가독성이 높아지고, 변수의 유효 범위를 쉽게 파악할 수 있습니다.

// 리팩토링 전
public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        if (a > b) {
            System.out.println("a is greater than b");
        } else {
            System.out.println("a is not greater than b");
        }

        int sum = a + b;
        System.out.println("Sum: " + sum);
    }
}


// 리팩토링 후
public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int sum = a + b;	// 변수 위치 변경

        if (a > b) {
            System.out.println("a is greater than b");
        } else {
            System.out.println("a is not greater than b");
        }

        System.out.println("Sum: " + sum);
    }
}

위의 코드 예시를 보면 리팩토링 전과 후의 다른 점은 변수 sum을 사용하는 곳의 위치가
변수와 가까이 선언되어 있다는 것입니다.

이를 보면 변수의 유효범위가 줄어들기에 코드의 가독성과 유지보수성이 향상됩니다.

마무리

중첩 반복문과 조건문을 메서드로 추출하여 Depth를 줄이는 것은 코드의 가독성과 유지보수성을 크게 향상시키는 중요한 기법입니다. 단순히 보이는 Depth만 줄이는 것이 아니라, 각 기능을 명확히 분리하고 추상화를 통해 코드 구조를 개선함으로써 더 이해하기 쉬운 코드를 작성할 수 있습니다.

profile
백엔드 개발자, 민경담입니다.

0개의 댓글