메서드 추출 리팩토링
리팩토링의 출발점인 “긴 메서드를 작은 메서드로 나누기(메서드 추출)“의 이유·원칙·이름짓기·단일 추상화 수준 원칙을 다루는 강의
리팩토링은 어디서 시작하나
- 기능 구현 + 테스트 작성이 끝났으면 리팩토링 준비 완료 (지난 시간 내용)
- 강사의 시작점: 제일 먼저 긴 메서드를 작은 메서드로 나눈다
📝 NOTE 정의 메서드 추출 리팩토링: 이해하기 어려운 긴 메서드에서, 의도를 명확히 표현하는 작은 메서드를 뽑아내는 것.
📌 IMPORTANT 여러 리팩토링 패턴 중 메서드 추출이 가장 중요하다. 작은 메서드가 다른 모든 리팩토링의 기반이 되기 때문.
메서드를 작게 만들면 좋은 점
- 길이가 짧아 코드 이해가 쉬움
- 수정이 쉬워 버그 수정·성능 최적화·기능 추가가 수월
- 의도를 드러내는 좋은 이름을 붙여 주석처럼 읽히는 코드 작성 가능
- 한 가지 작업만 하므로 재사용이 쉬움
- 자식 클래스에서 오버라이딩이 쉬움
- 다른 클래스로 옮기기 쉬워 설계 리팩토링이 수월
메서드 이름 짓기
📌 IMPORTANT 메서드 이름은 어떻게 구현하는지(How)가 아니라 무엇을 하는지(What) 를 표현해야 한다. (강의에서 두 번 강조)
- 메서드는 호출 목적으로 만들어지므로 호출자의 의도가 드러나게 명명
- 나쁜 예:
LinearSearch/HashedSearch/BinarySearch- 내부 구현 방식을 외부에 노출 → 클라이언트가 특정 구현에 묶임 → 설계 유연성 저하
- 좋은 예:
find- 클라이언트의 의도(찾는다)를 표현, 구현 방식은 감춤
추출 기준은 “길이”가 아니라 “의미적 차이”
- 메서드 길이 자체는 중요하지 않음
- 판단 기준: 메서드 코드와 이름 사이의 의미적 차이
- 의미적 차이가 크면 → 추출
- 의미적 차이가 작으면 → 그대로 둠
- 의도를 더 명확히 표현할 수 있다면 한 줄짜리도 추출할 가치가 있음
메서드를 추출하는 3가지 이유
- 가독성 향상 ← 가장 중요
- 중복 제거
- 의존성 고립
1) 가독성 — 단일 추상화 수준 원칙
📝 NOTE 정의 단일 추상화 수준 원칙: 하나의 메서드 안 모든 코드를 같은 추상화 수준에 두는 것. 저수준 코드와 고수준 코드가 섞이면 이 원칙을 위반한다.
- 고수준 코드 = 무엇을 하는지(What), 목표만 표현
- 저수준 코드 = 어떻게 달성하는지(How), 구체적 방법 서술
- 위반 시 뒤에 나올 교체 메서드 규칙도 함께 위반하게 됨
섞여 있을 때의 문제 (게임 클래스 run 메서드 예시)
System.out.println("환영합니다")직접 호출 → 저수준showRoom()호출 → 의도만 표현, 구현은 감춤 → 고수준- 수준이 바뀔 때마다 멈칫하게 되고, 고수준 메서드 내부까지 따라 들어가 분석해야 함
- 서로 다른 수준의 정보를 머릿속에 동시에 기억 → 이해 과정이 불필요하게 복잡
💡 TIP 해결 — 조합 메서드 패턴 추상화 수준을 동일하게 맞추면, 세부 구현을 몰라도 메서드의 목적을 한눈에 파악할 수 있다. 같은 수준의 코드들을 조합해 메서드를 구현하는 방식을 조합 메서드 패턴이라 부른다. 단일 추상화 수준 원칙을 따르는 메서드는 자연히 조합 메서드 형태가 된다.
- 정리된
run→welcome(),play(),parallel()등으로 추출 - “환영 출력 → 게임 실행 → 종료 출력”이 한눈에 보임.
welcome세부 구현은 궁금할 때만 열어보면 됨
2) 중복 제거
- 중복 코드를 발견하면 → 메서드로 추출하고 의도가 드러나는 이름을 붙임 → 중복 자리를 메서드 호출로 교체
3) 의존성 고립
- 여러 곳에서 참조하는 의존성을 메서드로 추출하면 이후 수정이 쉬워짐
- 예:
run메서드가 입력은Scanner, 출력은System에 의존- 외부 디바이스 의존 → 제어·테스트가 어려움
- 제어하기 어려운 클래스 의존 코드를 별도 메서드로 추출하면 유지보수성 향상
핵심 요약
- 리팩토링은 긴 메서드를 작은 메서드로 쪼개는 메서드 추출에서 시작하며, 이것이 가장 중요한 패턴이다.
- 메서드 이름은 구현 방식(How)이 아니라 하는 일(What) 을 표현해야 한다 (예:
find>BinarySearch). - 추출 기준은 길이가 아니라 코드와 이름의 의미적 차이다.
- 추출 이유는 가독성·중복 제거·의존성 고립 세 가지이며, 가독성이 가장 중요하다.
- 단일 추상화 수준 원칙(고수준/저수준 분리)을 지키면 메서드는 이해하기 쉬운 조합 메서드 형태가 된다.