2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[item 19] 클래스의 동작을 유지하면서 재정의 가능 메서드를 사용하는 코드를 제거할 수 있는 기계적인 방법 #68

Closed ssstopeun closed 1 year ago

ssstopeun commented 1 year ago

p.128에서

클래스의 동작을 유지하면서 재정의 가능 메서드를 사용하는 코드를 제거할 수 있는 기계적인 방법을 소개한다. 먼저 각각의 재정의 가능 메서드는 자신의 본문 코드를 private '도우미 메서드'로 옮기고, 이 도우미 메서드를 호출하도록 수정한다. 그런 다음 재정의 가능 메서드를 호출하는 다른 코드들도 모두 이 도우미 메서드를 직접 호출하도록 수정하면 된다.

이 부분이 잘 이해가 가지 않아 예시 코드가 궁금합니다.

gmelon commented 1 year ago

제가 이해한대로 작성해봤습니다

먼저, 리팩토링 전 코드입니다.

리팩토링 전

public class MyClass {

    public void methodA() {
        doSomething();
    }

    public void methodB() {
        doSomething();
    }

    public void doSomething() {
        System.out.println("뭔가 계산하는 로직 암튼 그럼");
    }

}

여기서, doSomething() 메서드가 재정의 가능 메서드 입니다. methodAmethodB도 얘를 사용하므로 하위 클래스에서 doSomething()을 맘대로 재정의하면 두 메서드의 동작에 문제가 생길 수 있습니다.

따라서,

  1. doSomething()의 본문을 private 메서드로 옮기고
  2. 기존에 doSomething()을 사용하던 메서드들이 새로운 private 메서드를 사용

하도록 리팩토링 할 수 있습니다.

리팩토링 후

public class MyClass {

    public void methodA() {
        doSomethingHelper();
    }

    public void methodB() {
        doSomethingHelper();
    }

    public void doSomething() {
        doSomethingHelper();
    }

    private void doSomethingHelper() {
        System.out.println("뭔가 계산하는 로직 암튼 그럼");
    }

}

이렇게 되면, 하위 클래스에서는 doSomethingHelper() 를 재정의할 수 없으므로 상위 클래스에서의 methodA()methodB()의 동작은 우선 문제가 발생하지 않습니다. 하위 클래스에서 doSomething()을 재정의해서 사용한다고 해도 상위 클래스에는 영향을 주지 않으므로 클래스의 동작을 유지하면서 재정의 가능 메서드를 사용하는 코드를 제거할 수 있게 됩니다.