리팩토링은 기존의 코드를 변경하지 않고 코드의 구조를 변경하여 코드의 가독성을 높이고 유지보수를 용이하게 하는 과정입니다. 코드의 기능은 그대로 유지하면서 내부 구조를 개선합니다. 아래에 몇 가지 리팩토링 방법에 대해 자세히 설명하겠습니다.
메소드 추출 (Extract Method): 한 메소드가 너무 많은 일을 하거나 코드의 일부분이 메소드의 목적과 직접적으로 관련이 없는 경우, 이 부분을 별도의 메소드로 추출할 수 있습니다.
전:
void printOwing() {
printBanner();
// outstanding 계산
double outstanding = 0.0;
for (Order order : orders) {
outstanding += order.getAmount();
}
// 세부사항 출력
System.out.println("이름: " + name);
System.out.println("총액: " + outstanding);
}
후:
void printOwing() {
printBanner();
double outstanding = calculateOutstanding();
printDetails(outstanding);
}
double calculateOutstanding() {
double result = 0.0;
for (Order order : orders) {
result += order.getAmount();
}
return result;
}
void printDetails(double outstanding) {
System.out.println("이름: " + name);
System.out.println("총액: " + outstanding);
}
메소드 인라인 (Inline Method): 메소드의 내용이 너무 단순하거나 해당 메소드가 한 번만 호출되는 경우, 메소드를 제거하고 해당 부분을 호출한 코드로 대체합니다.
전:
int getRating() {
return (moreThanFiveLateDeliveries()) ? 2 : 1;
}
boolean moreThanFiveLateDeliveries() {
return _numberOfLateDeliveries > 5;
}
후:
int getRating() {
return (_numberOfLateDeliveries > 5) ? 2 : 1;
}
변수명 변경: 변수명은 해당 변수의 용도를 명확하게 보여줘야 합니다. 이해하기 어려운 이름이나 잘못된 정보를 전달하는 이름은 코드의 가독성을 저하시킵니다.
전:
double d; // 경과 시간(일수)
후:
double elapsedTimeInDays;
클래스 추출 (Extract Class): 한 클래스가 너무 많은 일을 하거나 클래스의 목적과 직접적으로 관련이 없는 변수나 메소드가 있는 경우, 이들을 별도의 클래스로 분리할 수 있습니다.
전:
class Person {
String name;
String officeAreaCode;
String officeNumber;
}
후:
class Person {
String name;
TelephoneNumber telephone;
}
class TelephoneNumber {
String areaCode;
String number;
}
매직 넘버를 명명된 상수로 변경: 코드에서 직접적으로 사용된 숫자는 의미를 파악하기 어렵고 유지보수가 어렵습니다. 이를 의미있는 명명된 상수로 변경하여 가독성을 높일 수 있습니다.
전:
double potentialEnergy(double mass, double height) {
return mass * height * 9.81;
}
후:
static final double GRAVITATIONAL_CONSTANT = 9.81;
double potentialEnergy(double mass, double height) {
return mass * height * GRAVITATIONAL_CONSTANT;
}
주석의 제거: 가급적이면 주석을 쓰지 않는 것이 좋습니다. 코드 자체가 의도를 명확히 보여주어야 합니다. 주석이 필요하다면 코드를 더 명확하게 리팩토링해야 할 필요가 있을 수 있습니다.
전:
// 사전조건: amount는 반드시 양수여야 함
public void addAmount(int amount) {
if (amount > 0) {
this.amount += amount;
}
}
후:
public void addPositiveAmount(int amount) {
if (amount > 0) {
this.amount += amount;
}
}
이들 외에도 많은 리팩토링 기법들이 있습니다. 리팩토링은 단순히 코드를 '더 나은' 상태로 만드는 것이 아니라, 코드의 품질을 유지하면서 소프트웨어의 이해도를 높이는 핵심적인 개발 방법입니다.
'Programing > JAVA' 카테고리의 다른 글
Java에서의 Set<String> 및 Map<String, ?> 자료구조 (0) | 2023.09.14 |
---|---|
ByteBuffer를 활용하여 Protocol Data 파싱하기 (0) | 2023.08.24 |
테스트 주도 개발(TDD)_예제를 통한 설명 (0) | 2023.07.28 |
setup() 메서드 (0) | 2023.07.28 |
SPRING의 DI를 나만 이해하기쉽게.. (0) | 2023.07.28 |