개발을 진행하다 보면 처음에는 잘 작성된 코드라고 생각되었지만, 시간이 지나면서 복잡해지고 유지보수가 까다로운 코드로 변하는 경우가 많습니다. 이때 꼭 필요한 작업이 바로 리팩토링(Refactoring) 입니다.
리팩토링이란 기존 코드의 기능은 그대로 유지하면서 코드 구조 및 가독성을 향상시키는 작업입니다. 이번 글에서는 개발자가 꼭 알아야 할 깨끗한 코드를 위한 리팩토링 핵심 테크닉 10가지를 알려드리겠습니다.
1️⃣ 의미 있는 이름 짓기 (Rename Method / Rename Variable)
의미 없는 이름은 코드의 가독성을 떨어뜨리고 변경 시에도 혼란을 유발할 수 있습니다. 변수와 메서드에 명확한 의도가 드러나는 이름을 사용하면 코드를 더욱 쉽게 읽고 유지보수할 수 있습니다.
✅ 예시:
int d;
→int elapsedDays;
void doIt();
→void sendEmail();
2️⃣ 긴 메서드 분리하기 (Extract Method)
하나의 메서드가 너무 많은 작업을 처리하고 있다면 독립적인 다른 메서드로 나누어 주는 것이 좋습니다. 이를 통해 가독성을 개선하고 유지보수가 용이해집니다.
✅ 예시:
// 긴 메서드일 경우
void printReport() {
printHeader();
printBody();
printFooter();
}
// 메서드를 분리한다면
void printReport() {
printHeader();
printBody();
printFooter();
}
void printHeader() { /* Header 출력 코드 */ }
void printBody() { /* 본문 출력 코드 */ }
void printFooter() { /* Footer 출력 코드 */ }
3️⃣ 중복된 코드 통합하기 (Extract Class / Method)
중복된 코드는 유지보수가 어렵고, 변경 시 누락이 발생할 가능성이 큽니다. 공통으로 쓰이는 코드 부분은 별도의 메서드나 클래스로 추출하여 중복을 피하세요.
✅ 예시:
// 중복 코드 제거 전
double calculateDiscount(double price) {
return price * 0.9;
}
double calculatePromotionPrice(double price) {
return price * 0.9;
}
// 중복된 코드 추출 후
double discount(double price) {
return price * 0.9;
}
4️⃣ 조건 분기문 간소화 하기 (Replace Conditional with Polymorphism)
switch문이나 복잡한 조건문(If-else)을 많이 쓰면 가독성이 떨어집니다. 이럴 때 다형성과 인터페이스를 활용하면 조건문의 복잡도와 코드 재사용성을 높일 수 있습니다.
✅ 예시:
// 리팩토링 전
if(type.equals("Cat")) {
runCat();
} else if(type.equals("Dog")) {
runDog();
}
// 리팩토링 후 - 다형성 활용
interface Animal {
void run();
}
class Cat implements Animal {
public void run() { /* 고양이 관련 작업 */ }
}
class Dog implements Animal {
public void run() { /* 개 관련 작업 */ }
}
// 사용 코드
animal.run();
5️⃣ 컬렉션 캡슐화 (Encapsulate Collection)
객체 내 컬렉션을 외부에 직접 노출하지 말고 getter를 통해 불변한 형태로 반환하거나 의미있는 메서드를 통해 엔티티를 관리하는 게 좋습니다.
✅ 예시:
private List<Order> orders = new ArrayList<>();
// 불변 컬렉션 반환 예시
public List<Order> getOrders() {
return Collections.unmodifiableList(orders);
}
6️⃣ 파라미터 개수 줄이기 (Introduce Parameter Object)
파라미터의 개수가 많을수록 메서드 호출이 어렵고 오해가 생기기 쉽습니다. 이때 별도의 파라미터 객체를 만들어 관리함으로써 코드의 명료함을 높입니다.
✅ 예시:
// 파라미터가 너무 많은 메서드
void bookFlight(String departure, String arrival, Date date, String passengerName);
// 파라미터 객체로 리팩토링
void bookFlight(FlightDetails details);
class FlightDetails {
String departure;
String arrival;
Date date;
String passengerName;
}
7️⃣ 메서드의 부수적 효과 제거하기 (Remove Side Effects)
함수가 외부의 상태를 변경하거나 예상 밖의 동작을 하지 않도록 메서드를 가능한 순수함수 형태로 설계하여 예측 가능성을 높여줍니다.
8️⃣ 임시변수 줄이기 (Inline Variable)
불필요한 임시 변수가 많으면 코드의 명료성이 떨어집니다. 가능한 인라인으로 선언하여 코드 가독성을 높이세요.
✅ 예시:
// 임시 변수 줄이기 전
double basePrice = order.quantity * order.itemPrice;
return basePrice > 1000;
// 인라인으로 바꾼 후
return (order.quantity * order.itemPrice) > 1000;
9️⃣ 예외 처리를 명확하게 (Replace Error Code with Exception)
반환 결과로 예외 상황을 표현하는 대신, 자바의 Exception 처리를 적극 활용해 프로그램 흐름을 명확하게 하세요.
✅ 예시:
// 예외 처리를 활용한 코드
if(balance < amount) {
throw new InsufficientBalanceException("잔고가 부족합니다.");
}
🔟 객체 생성 로직 캡슐화하기 (Replace Constructor with Factory Method)
객체 생성 시 복잡하거나 특별한 생성 과정을 가질 때 팩토리 메서드를 도입하면 로직을 숨기고 단순화가 됩니다.
✅ 예시:
Car sedan = CarFactory.createSedan();
Car suv = CarFactory.createSUV();
📌 마무리
위에서 소개한 리팩토링 방법들을 꾸준히 적용하다 보면, 코드의 가독성과 유지보수가 매우 편리해질 것입니다. 중요한 것은 '한 번에 모든 것을 다 바꾸려고 하지 말고 지속적으로 리팩토링하는 습관을 갖는 것'입니다.
여러분도 오늘 바로 간단한 리팩토링부터 하나씩 실천해 보세요. 곧 코드가 더욱 깔끔하고 보기 좋게 변하는 것을 경험할 수 있을 겁니다 😊
오늘도 Happy Coding 하세요 ! 🎉
ChatGPT, 블록체인, 자바, 맥북, 인터넷, 컴퓨터 정보를 공유합니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!