[Effective Java] 13. 접근 권한의 최소화

1 분 소요

잘 설계된 모듈은 구현 세부사항을 API 뒤에 잘 숨긴다.
즉, 정보 은닉(information hiding). 다른말로 캡슐화(encapsulation)가 잘 된 것이다.

1. 캡슐화의 중요성

모듈간의 캡슐화가 잘 된 경우 모듈사이 의존성을 낮춰서 개별적인 개발, 테스트, 최적화, 수정이 가능해진다. 이로인해 개발 효율이 높아지고 유지보수 부담도 줄어든다.

또한 이러한 모듈은 재활용성이 높아서 다른 소프트웨어 개발시 특정 모듈만 재활용 할 수 있게된다.

2. 자바의 정보은닉 원칙

자바에서는 접근제한자를 적절하게 사용하는 것이 정보은닉의 핵심 부분이고, 각 클래스와 멤버가 가능한 접근 불가능하게 만들라. 라는 단순한 원칙을 지키면 된다.

즉, 개발중인 소프트웨어가 정상동작 하는 범위 내에서 가장 낮은 접근 제한자를 설정하라는 것이다.

3. Class나 Interface

최상위 레벨의 class나 interface에는 package-private 또는 public만 사용 가능하다.

그리고 가능한 package-private으로 선언해야 한다.
package-private으로 선언하게 되면 외부로 공개되는 API의 일부가 아니라 구현 세부사항에 속하게 되므로 다음 릴리즈 배포시 수정에 대한 부담이 적다.

이는 library성 코드를 만들때 중요한 내용이겠다. 일반적으로 한 시스템에 묶이는 개발을 할때는 public이냐 package-private이냐는 그렇게까지 중요하지 않을 것 같다.

만약 package-private으로 선언한 클래스를 사용하는 곳이 한곳밖에 없다면 해당 클래의 내에 중첩클래스로 만드는것도 괜찮다.
그러면 그 클래스의 접근 범위는 더 줄어들게 된다.

4. 접근제한의 일부 규칙

1. 부모클래스의 메서드를 자식 클래스에서 오버라이드 할때 원래 메서드의 접근제한자보다 낮은 권한을 설정할 수 없다.

class Parent{
    protected boolean test() {
        return false;
    }
}
	
class Child extends Parent {
    // 컴파일 에러 발생. public은 가능
    @Override
    private boolean test() {
        return true;
    }
}

만약 위와 같이 오버라이딩한 메서드의 접근제한자를 더 낮출수 있다면 아래 코드는 문제가 된다.

Parent p = new Parent();
Child c = new Child();
c.test();

test()는 부모클래스의 메서드라 사용할 수 있어야 하는데 사용이 불가능하게 되버리는 이상한 상태가 되어버린다.

2. Interface를 implements 하는곳에서는 모두 public 메서드로 오버라이딩 해야 한다. Interface의 모든 멤버는 원래 public이기 때문이다.

댓글남기기