본문 바로가기

Snippets

final, 접근제어자

레거시 코드를 리팩토링을 할 때, final 키워드가 없고 접근제어자가 public 인 메소드를 마주하면, 아래 의문을 계속 확인하면서 작업해야 한다.

  1. 이 메소드는 왜 public 이지? 외부에서 사용하는 곳이 있나?
  2. 이 메소드를 어디선가 override 해서 사용하고 있나?

API 를 만들 때, 이 클래스를 사용할 개발자에게 어디까지 노출할 것인지를 계속 확인해야 한다.

 

public interface A {
    void a1();
}

public class AImpl implements A {
    @Override
    public void a1() {
        a2();
        a3();
    }

    public void a2() { .. }

    private void a3() { .. }
}

 

AImpla1() 메소드는 같은 클래스의 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() { .. }
}

 

AImpla1() 에는 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