레거시 코드를 리팩토링을 할 때, final 키워드가 없고 접근제어자가 public 인 메소드를 마주하면, 아래 의문을 계속 확인하면서 작업해야 한다.
- 이 메소드는 왜 public 이지? 외부에서 사용하는 곳이 있나?
- 이 메소드를 어디선가 override 해서 사용하고 있나?
API 를 만들 때, 이 클래스를 사용할 개발자에게 어디까지 노출할 것인지를 계속 확인해야 한다.
public interface A {
void a1();
}
public class AImpl implements A {
@Override
public void a1() {
a2();
a3();
}
public void a2() { .. }
private void a3() { .. }
}
AImpl
의 a1()
메소드는 같은 클래스의 a2()
, a3()
를 호출해 적절한 행동을 처리한다. AImpl
클래스를 작성한 개발자의 의도에 맞게 동작하려면, 외부에서는 a1()
만 보여야하고, AImpl
을 상속해도 a1()
을 Override
할 수 없어야 한다.
final
키워드, 접근제어자
를 설정해 외부에서 접글 할 수 없도록 해야한다.
public interface A {
void a1();
}
public class AImpl implements A {
@Override
public final void a1() {
a2();
a3();
}
private void a2() { .. }
private void a3() { .. }
}
AImpl
의 a1()
에는 final
키워드를 붙여 재정의를 할 수 없도록 하고, a2()
는 외부에 공개하지 않는다. a2()
가 훅 메소드라면, 상속해 구현하는 클래스에서만 접근할 수 있도록 접근제어자를 protected
로 설정해야 한다.
AImpl
클래스를 사용하는 개발자에게 최소한의 정보를 제공해야한다. 그렇지 않으면, AImpl
클래스를 어떻게 사용할 지 예측할 수 없고, AImpl
클래스 개발자가 의도하지 않은 에러를 일으킬 수 있다.
'Snippets' 카테고리의 다른 글
첫 번째 목표 (0) | 2021.11.24 |
---|---|
Server 와 Client (0) | 2021.11.22 |
모든 소프트웨어 모듈의 목적 (0) | 2021.11.14 |
Compile Error, Runtime Error (0) | 2021.11.09 |
Proxy, Decorator 패턴 (0) | 2021.11.08 |