java default 접근 제어자 활용 범위?

자바의 접근 제어자는 다른 클래스로부터 정보와 데이터의 접근을 제어한다.

public : 어떤 클래스에서도 접근이 가능

private : 외부의 어떤 클래스에서도 접근이 불가능

protected : 같은 패키지 및 상속 받은 클래스에서 접근 가능.

default : 같은 패키지에 있는 클래스에서만 접근 가능

여기서 protected, default 접근제어자를 사용할 때 주의해야 할 점은 꼭! 같은 패키지여야만 한다는 것이다.

예를 들어 A 패키지에 존재하는 Board 클래스에 default 접근제어자로 선언되어 있는 add 메소드가 존재하고, A 패키지 하위에 B 패키지가 존재한다면. B 패키지 안에 있는 NoticeBoard 클래스에서 A 패키지에 있는 Board 클래스의 add 메소드에 접근할 수 없다. 즉, 같은 depth에 있는 패키지에서만 접근이 가능하다는 것이다.

자바의 접근제어자가 제공하는 기능이 위와 같다면 default 접근제어자는 어떤 경우에 사용할 수 있을까?

대게 layer 아키텍처를 구성할 때 나는 다음과 같이 구성한다.

board 패키지 – controller 패키지

          |

          – service 패키지

         |

             – dao 패키지

                  |

                   – vo 패키지

위와 같은 패키지 구조에서 default 접근제어자를 꼭 쓰고 싶은 경우에는 interface에 적용하면 좋을 것 같다는 생각을 한다.


controller 패키지에서 service 패키지에 있는 특정 클래스를 사용하고 싶을 때에는 객체지향의 OCP(개방폐쇄원칙)를 지키기 위해 controller 와 service의 중간에 인터페이스를 설계한 후 런타임 의존 관계를 구성한다. 

service 패키지 안에 인터페이스를 생성하고 추상화된 메소드들을 모두 default 접근 제어자를 사용하게 된다면 다른 패키지에서 service 패키지 내에 있는 인터페이스로의 접근을 막을 수 있다. 이와 같이 접근 자체를 차단하는 것이 객체지향에서의 캡슐화이다.