리팩토링이란?
- 동작을 유지한 체 코드 내부 구조를 개선하는 작업
- 가독성을 높이고 유지보수 하기 좋도록 바꾸는 과정
- 코드 중복을 최소화
- 버그를 쉽게 찾을 수 있도록 한다.
리팩토링이 필요한 시기
- 중복된 코드가 많을때
- 하나의 함수 또는 클래스가 너무 많은 일을 할 때
- 이해하기 어려운 코드일 때
- 하나의 기능을 수정할 때마다 여러 메서드를 수정해야 한다면 하나의 클래스가 하나의 책임만 가질 수 있게 개선
- 새로운 기능 추가하기 어려울 때
- 비슷한 버그가 계속 발생할 때
- 테스트가 어렵거나 불가능할 때
리팩토 기법
1. 메서드 추출(Extract Method)
중복된 코드, 긴 메서드, 들을 별도의 메서드로 분리해 가독성과 재사용성을 높이는 기법
2. 변수 이름 변경(Rename Variable)
의미 없는 변수명 의미 있는 이름으로 바꿔 코드의 의도를 명확히 전달하는 기법
3. 클래스 추출
하나의 클래스에 너무 많은 책임이 몰려 있을 때, 관련 책임까지 묶어서 새로운 클래스로 분리하는 기법
예를 들면 유저 관련 하는 클래스에 유저 정보 외에도 다른 걸 처리하고 있다면 그걸 분리하는 작업을 진행한다.
4. 함수 이동
다른 클래스에 있는 게 더 자연스러운 함수를 그쪽으로 옮기는 방법
5. 대리 객체 은폐(Hide Delegate)
어떤 객체가 내부 객체를 통해 기능을 수행할 때,
클라이언트가 내부 객체까지 알 필요 없도록 인터페이스를 단순화
하는 리팩토링 기법입니다.
즉, 중첩된 접근을 외부에서 감추고, 중간에 메서드를 추가해 클라이언트 코드의 결합도를 낮춥니다.
원래 코드
class Department {
private String manager;
public Department(String manager) {
this.manager = manager;
}
public String getManager() {
return manager;
}
}
class Person {
private Department department;
public Person(Department department) {
this.department = department;
}
public Department getDepartment() {
return department;
}
}
// 클라이언트 코드
Person john = new Person(new Department("Alice"));
String manager = john.getDepartment().getManager(); // 내부 객체까지 접근
리팩토링 후 코드
class Department {
private String manager;
public Department(String manager) {
this.manager = manager;
}
public String getManager() {
return manager;
}
}
class Person {
private Department department;
public Person(Department department) {
this.department = department;
}
// 위임 숨기기 적용
public String getManager() {
return department.getManager();
}
}
// 클라이언트 코드
Person john = new Person(new Department("Alice"));
String manager = john.getManager(); // 내부 구조를 알 필요 없음
⇒ 즉 내부 객체를 꺼내는 것이 아니라 필요한 값만 꺼내도록 인터페이스를 만들어야 한다.
반응형