1. 리팩토링
1) 메서드 추출
- 한 메서드에 세세한 처리가 많을 때 그런 처리를 묶어서 나누고 독립된 메서드로 추출하는 것
2) 리팩토링 카탈로그
이름 | 메서드 추출(Extract Method) |
상황 | 메서드를 작성함 |
문제 | 메서드 하나가 너무 김 |
해법 | 기존 메서드에서 묶을 수 있는 코드를 추출해 새로운 메서드를 작성함 |
결과 | O 각 메서드가 짧아짐 X 메서드 개수가 늘어남 |
2. 예제 프로그램
클래스명 | 역할 |
Banner | 테두리 안에 문자열을 출력하는 클래스 |
Main | 동작 확인용 클래스 |
1) 리팩토링 전
public class Banner {
private final String _content;
public Banner(String content) {
_content = content;
}
public void print(int times) {
// 테두리출력
System.out.print("+");
for (int i = 0; i < _content.length(); i++) {
System.out.print("-");
}
System.out.println("+");
// 내용출력
for (int i = 0; i < times; i++) {
System.out.println("|" + _content + "|");
}
// 테두리출력
System.out.print("+");
for (int i = 0; i < _content.length(); i++) {
System.out.print("-");
}
System.out.println("+");
}
}
public class Main {
public static void main(String[] args) {
Banner hello = new Banner("Hello, World!");
hello.print(3);
}
}
위 코드는 print함수안에 테두리, 내용 출력 등 다양한 기능이 들어가 있으므로 메서드 추출을 한다.
2) 리팩토링 실행
① 새로운 메서드 작성
⑴ 새로운 메서드에 적절한 이름 붙이기
- 메서드 이름은 '동사+명사' 순으로 짓는게 보통
- 메서드 이름은 무엇을 하는가(What to do)를 알 수 있게 지어야 함
⑵ 기존 메서드에서 새로운 메서드로 코드 복사
- 새로 만든 메서드는 private로 지정(다른 클래스에서 호출x)
⑶ 메서드 내부의 지역 변수 검토
⑷ 메서드 매개변수 검토
⑸ 메서드 반환값 검토
⑹ 컴파일
② 새로운 메서드 호출
⑴ 기존 메서드에서 앞서 코드를 복사한 부분을 새로운 메서드 호출로 치환
⑵ 기존 메서드에서 더는 사용하지 않는 지역 변수가 있으면 삭제
⑶ 컴파일해서 테스트
3) 리팩토링 후
public class Banner {
private final String _content;
public Banner(String content) {
_content = content;
}
public void print(int times) {
printBorder();
printContent(times);
printBorder();
}
private void printBorder() {
System.out.print("+");
for (int i = 0; i < _content.length(); i++) {
System.out.print("-");
}
System.out.println("+");
}
private void printContent(int times) {
for (int i = 0; i < times; i++) {
System.out.println("|" + _content + "|");
}
}
}
3. 한 걸음 더 나아가기
1) 역 리팩토링
- 메서드 인라인화 : 메서드로 만들 정도가 아닌 간단한 처리라면 메서드 본문을 메서드 호출부에 직접 작성하는 것
* 오버라이드된 메서드는 인라인화 하면 안됨 !
2) 메서드 추출은 당연한가? 의식하면서 해야함
3) 메서드가 길어지는 경우 메서드 추출 고려!
4. 정리
- 길이가 길어서 읽기 어려운 코드에서 그룹으로 쪼개 새로운 메서드로 만들면 메서드가 짧아지고 처리개요 알기 쉬움!
5. 연습 문제
1) 메서드가 너무 길어서 읽기 힘들면 메서드 추출을 검토한다 (O)
2) 메서드 추출로 추출한 메서드는 public으로 만든다(X) => private으로 만든다
3) 메서드명은 '어떻게 하는가'를 잘 알 수있는 이름이 좋다(X) => 무엇을 하는가를 알아야 한다.
'Major > Java' 카테고리의 다른 글
[자바로 배우는 리팩토링 입문] 7장 분류 코드를 클래스로 치환 (0) | 2022.06.04 |
---|---|
[자바로 배우는 리팩토링 입문] 6장 클래스 추출 (0) | 2022.06.02 |
[자바로 배우는 리팩토링 입문] 4장 널 객체 도입 (0) | 2022.04.15 |
[자바로 배우는 리팩토링 입문] 3장 어서션 도입 (0) | 2022.04.15 |
[자바로 배우는 리팩토링 입문] 2장 제어 플래그 삭제 (0) | 2022.04.13 |