메서드 상향

이름이 같은 메서드가 여러 하위클래스에 들어 있을 땐,
그 메서드를 상위 클래스로 옮긴다

특징

  • 다른 리팩토링 단계를 마친 후 적용하는 것이 일반적이다
  • 다른 클래스에 있는 두 개의 메서드가 매개변수로 전환되어 결국 같은 메서드가 될 수도 있다
  • 하위클래스가 상위 클래스 기능을 재정의했음에도 불구하고 기능이 같다면, 바로 실시해야 한다
  • 두 메서드가 똑같진 않고 비슷한 부분이 있다면 템플릿 메서드 형성을 실시하는 방법도 있다

방법

  1. 메서드가 서로 같은지 검사한다
    • 거의 비슷한데 똑같진 않다면 알고리즘 전환을 적용해서 메서드를 똑같게 만든다
  2. 메서드 시그니처가 서로 다르다면 모든 시그니처를 상위클래스에서 사용하고자 하는 시그니처로 수정한다
  3. 상위클래스에 새 메서드를 작성하고, 하위클래스의 메서드를 복사해서 넣은 뒤 적절히 수정하고 컴파일한다
    • 메서드가 하위클래스의 메서드를 사용한다면 상위클래스에 abstract 타입 메서드를 선언한다
    • 메서드가 하위클래스의 필드를 사용한다면 필드 상향이나 필드 자체 캡슐화를 적용한다
  4. 하위클래스 메서드를 하나 삭제하고 컴파일과 테스트를 실시한다
  5. 4번과 같은 식으로 상위클래스 메서드만 남을때까지 메서드를 계속 삭제한다
  6. 메서드 호출하는 부분을 상위클래스로 대체할 수 있는지 파악하고, 수정할 수 있으면 수정한다

참고 : 마틴 파울러, 『리팩토링』, 김지원 옮김, 한빛미디어(2012)