[Java] Section9 - 문제 풀이 1

코드 속의 "진돌"·2024년 1월 10일
0
post-thumbnail

✅ 평균값 리팩토링


🔔 메서드를 잘 이해하고 있는지 확인하기 위해 다음 코드를 메서드를 사용하도록 리팩토링해보자.

✏️ MethodEx1

package method.ex;

public class MethodEx1 {

  public static void main(String[] args) {
    int a = 1;
    int b = 2;
    int c = 3;

    int sum = a + b + c;
    double average = sum / 3.0;
    System.out.println("평균값: " + average);

    int x = 15;
    int y = 25;
    int z = 35;

    sum = x + y + z;
    average = sum / 3.0;
    System.out.println("평균값: " + average);
  }
}

✏️ 실행 결과

평균값: 2.0
평균값: 25.0

✏️ 정답

package method.ex;

public class MethodEx1Ref {

  public static void main(String[] args) {
    System.out.println("평균값: " + average(1, 2, 3));
    System.out.println("평균값: " + average(15, 25, 35));
  }

  public static double average(int a, int b, int c) {
    int sum = a + b + c;
    return sum / 3.0;
  }
}

✅ 반복 출력 리팩토링


🔔 다음은 특정 숫자만큼 같은 메시지를 반복 출력하는 기능이다. 메서드를 사용해서 리팩토링해보자.

✏️ MethodEx2

package method.ex;

public class MethodEx2 {

  public static void main(String[] args) {
    String message = "Hello, world!";

    for (int i = 0; i < 3; i++) {
      System.out.println(message);
    }

    for (int i = 0; i < 5; i++) {
      System.out.println(message);
    }

    for (int i = 0; i < 7; i++) {
      System.out.println(message);
    }
  }
}

✏️ 실행 결과

Hello, world!
Hello, world!
...  // 여러번 반복

✏️ 정답

package method.ex;

public class MethodEx2Ref {

  public static void main(String[] args) {
    printMessage(3, "Hello, world!");
    printMessage(5, "Hello, world!");
    printMessage(7, "Hello, world!");

  }

  public static void printMessage(int n, String message) {
    for (int i = 0; i < n; i++) {
      System.out.println(message);
    }
  }
}

✅ 입출금 리팩토링


🔔 다음은 입금, 출금을 나타내는 코드이다. 입금(deposit)과, 출금(withdraw)을 메서드로 만들어서 리팩토링해보자.

✏️ MethodEx3

package method.ex;

public class MethodEx3 {

  public static void main(String[] args) {
    int balance = 10000;

    // 입금 1000
    int depositAmount = 1000;
    balance += depositAmount;
    System.out.println(depositAmount + "원을 입금하셨습니다. 현재 잔액: " + balance + "원");

    // 출금 2000
    int withdrawAmount = 2000;
    if (balance >= withdrawAmount) {
      balance -= withdrawAmount;
      System.out.println(withdrawAmount + "원을 출금하셨습니다. 현재 잔액: " + balance + "원");
    } else {
      System.out.println(withdrawAmount + "원을 출금하려 했으나 잔액이 부족합니다.");
    }

    System.out.println("최종 잔액: " + balance + "원");
  }
}

✏️ 실행 결과

1000원을 입금하였습니다. 현재 잔액: 11000원
2000원을 출금하였습니다. 현재 잔액: 9000원
최종 잔액: 9000원

✏️ 정답

package method.ex;

public class MethodEx3Ref {

  public static void main(String[] args) {
    int balance = 10000;

    balance = deposit(balance, 1000);
    balance = withdraw(balance, 2000);

    System.out.println("최종 잔액: " + balance + "원");
  }

  public static int deposit(int balance, int amount) {
    balance += amount;
    System.out.println(amount + "원을 입금하셨습니다. 현재 잔액: " + balance + "원");
    return balance;
  }

  public static int withdraw(int balance, int amount) {
    if (balance >= amount) {
      balance -= amount;
      System.out.println(amount + "원을 출금하셨습니다. 현재 잔액: " + balance + "원");
    } else {
      System.out.println(amount + "원을 출금하려 했으나 잔액이 부족합니다.");
    }

    return balance;
  }
}

리팩토링 결과를 보면 main()은 세세한 코드가 아니라 전체 구조를 한눈에 볼 수 있게 되었다. 쉽게 이야기해서 책의 목차를 보는 것 같다. 더 자세히 알고 싶으면 해당 메서드를 찾아서 들어가면 된다. 그리고 입금과 출금 부분이 메서드로 명확하게 분리되었기 때문에 이후에 변경 사항이 발생하면 관련된 메서드만 수정하면 된다. 특정 메서드로 수정 범위가 한정되기 때문에 더 유지보수 하기 좋다.

이런 리팩토링을 메서드 추출(Extract Method)이라 한다. 메서드를 재사용하는 목적이 아니어도 괜찮다. 메서드를 적절하게 사용해서 분류하면 구조적으로 읽기 쉽고 유지보수 하기 좋은 코드를 만들 수 있다.

그리고 메서드의 이름 덕분에 프로그램을 더 읽기 좋게 만들 수 있다.

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글

관련 채용 정보