🔔 메서드를 잘 이해하고 있는지 확인하기 위해 다음 코드를 메서드를 사용하도록 리팩토링해보자.
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;
}
}
🔔 다음은 특정 숫자만큼 같은 메시지를 반복 출력하는 기능이다. 메서드를 사용해서 리팩토링해보자.
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)을 메서드로 만들어서 리팩토링해보자.
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)이라 한다. 메서드를 재사용하는 목적이 아니어도 괜찮다. 메서드를 적절하게 사용해서 분류하면 구조적으로 읽기 쉽고 유지보수 하기 좋은 코드를 만들 수 있다.
그리고 메서드의 이름 덕분에 프로그램을 더 읽기 좋게 만들 수 있다.