카테고리:

업데이트:

1. 들어가기

잘 설계된 컴포넌트의 가장 큰 특징이 뭘까요?

바로, 클래스 내부 데이터와 내부 구현 정보를 완벽히 숨겨, 구현과 API를 깔끔하게 분리한 것입니다.

이 개념은 정보 은닉 혹은 캡슐화라 하고, 소프트웨어 설계의 근간이 되는 원리입니다.

그럼 정보 은닉에 대해 알아봅시다.

2. 정보 은닉

먼저, 정보 은닉과 캡슐화를 같은 개념으로 생각하는 분들이 많습니다.

그래서 둘의 차이점을 간단하게 짚고 넘어가겠습니다.

  • 캡슐화

    캡슐화는 관련된 데이터와 함수를 하나로 “묶는” 장치로 캡슐의 외부와 내부를 구별합니다.

    이는 추상화와 재사용의 단위가 됩니다.

  • 정보 은닉

    캡슐 속에 있는 데이터와 함수를 외부에 노출시키지 않고 내부에 “숨기는” 장치입니다.

캡슐화는 정보 은닉을 실현하는 장치이다.

정보 은닉을 실현하면 어떤 이점이 있을까요?

  • 시스템 개발 속도를 높인다. (여러 컴포넌트를 병렬로 개발)

  • 시스템 관리 비용을 낮춘다. (컴포넌트의 빠른 디버깅과 교체 가능)

  • 성능 최적화에 도움을 준다.

  • 소프트웨어 재사용성을 높인다. (독립적인 컴포넌트 개발 가능)

  • 큰 시스템을 제작하는 난이도를 낮춘다. (시스템이 완성되지 않아도 개별 컴포넌트 동작 검증 가능)

이러한 많은 이점이 있는 정보 은닉을 실현하기 위해 Java는 다양한 장치를 제공합니다.

그 중, 접근 제어 메커니즘은 클래스, 인터페이스, 멤버의 접근성을 명시하는데

각 요소의 접근성은 그 요소가 선언된 위치와 접근 제한자로 정해집니다.

그리고 이 접근 제한자를 제대로 활용하는 것이 정보 은닉의 핵심입니다.

3. 접근 제한자

이번 Item의 제목인 ‘클래스와 멤버의 접근 권한을 최소화하라’의 의미는

소프트웨어가 올바르게 동작하는 한 항상 가장 낮은 접근 수준을 부여하라는 의미입니다.

접근 수준이 낮은 접근 제한자부터 차례대로 살펴봅시다.

  • private

    멤버를 선언한 톱레벨 클래스에서만 접근할 수 있습니다.

  • package-private (default)

    멤버가 소속된 패키지 안의 모든 클래스에서 접근할 수 있습니다.

    접근 제한자를 명시하지 않았을 때 적용되는 접근 수준입니다.

  • protected

    package-private 접근 범위를 포함합니다.

    추가로 이 멤버를 선언한 클래스의 하위 클래스에서도 접근할 수 있습니다.

  • public

    모든 곳에서 접근할 수 있습니다.

4. 접근 제한자 사용 시 주의 사항

접근 제한자를 사용할 때 주의사항을 알아봅시다.

  • 톱레벨 클래스나 인터페이스를 패키지 외부에서 쓰지 않는다면 package-private으로 선언해야 한다.

  • 상위 클래스의 메서드를 재정의할 때는 접근 수준을 상위 클래스보다 좁게 설정하지 못한다.

  • public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다.

  • 클래스에 public static final 배열 필드를 두거나 이 필드를 반환하는 접근자 메서드를 제공하면 안된다.

5. 모듈 접근 수준

Java 9에서 모듈 시스템이라는 개념이 도입되면서 암묵적 접근 수준이 추가되었습니다.

보통 public과 protected 접근 제한자를 선언하면 다른 패키지에서 사용 가능한데

모듈을 공개(export)하지 않는다면 그 효과가 모듈 내부로 한정됩니다.

그래서 모듈을 사용하고 그 모듈을 숨기면 공개 API가 되지 않는 것이죠.

6. 모듈 접근 수준 사용 시 주의 사항

하지만, 모듈의 접근 수준은 주의해서 사용해야 합니다.

만약 모듈의 JAR 파일을 자신의 모듈 경로가 아닌 애플리케이션 classpath에 두면

그 모듈 안의 모든 패키지는 마치 모듈이 없는 것처럼 행동하기 때문에

모듈의 export와 관계없이 공개 API가 되버립니다.

7. 정리

이번 포스트는 접근 권한에 대해 알아보았습니다.

애플리케이션을 개발할 때 요소의 접근성은 가능한 최소한으로 설계 하고,

꼭 필요한 것만 골라 최소한의 공개 API를 설계해서 의도치 않게 API로 공개되는 일이 없도록 해야 합니다.

            
              📕 개인 기록용 블로그입니다.
              😊 오타나 잘못된 정보가 있을 경우 댓글이나 메일로 말씀해주시면 바로 수정하겠습니다! 😊
          

댓글남기기