이펙티브 자바

접근 지정자 - Java

호종이 2022. 1. 24. 20:11

어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API 를 깔끔히 분리한다. 정보 은닉, 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다.

 

정보 은닉의 장점


  • 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있다.
  • 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 비용도 적다.
  • 소프트웨어 재사용성을 높인다. 외부에 거의 의존하지 않고 독자적으로 동작할 수 있는 컴포넌트라면 그 컴포넌트와 함께 개발되지 않은 낯선 환경에서도 유용하게 쓰일 가능성이 크기 때문이다.
  • 큰 시스템을 제작하는 난이도를 낮춰준다. 시스템 전체가 아직 완성되지 않은 상태에서도 개별 컴포넌트의 동작을 검증할 수 있다.

 

자바는 정보 은닉을 위한 다양한 장치를 제공한다. 그 중 접근 제어 메커니즘은 클래스, 인터페이스, 멤버의 접근성을 명시한다. 각 요소의 접근성은 그 요소가 선언된 위치와 접근 제한자 (private, protected, public ) 으로 정해진다.

 

Java 의 접근 지정자

1. public 

public 은 어디에서나 접근 가능하다. 같은 클래스, 부모 클래스, 자식클래스, 그리고 다른 패키지에서도 접근 가능하다.

 

2. default 

접근 지정자를 지정해주지 않으면 설정되는 기본값으로, 같은 패키지에 존재하는 모든 멤버가 접근 가능하지만, 외부 패키지에선 접근이 불가능하다

 

3. protected

protected 는 동일 클래스, 동일 패키지, 그리고 내외부의 자식 클래스에서 접근이 가능하다.

 

4. private

private은 동일 클래스에서만 접근할 수 있다. 만약 외부에서 해당 멤버에 접근하고 싶다면, public 메소드를 사용해야 한다.

 

접근 지정자 범위 대상
public 같은 프로젝트 내 모든 파일 클래스,필드,생성자,메소드
default 같은 패키지에 소속된 멤버 클래스,필드,생성자,메소드
protected 같은 패키지, 같은 클래스, 자식 클래스 필드,생성자,메소드
private 같은 클래스에서만 접근 가능함 필드,생성자,메소드

 

모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다


모든 클래스와 멤버의 접근성은 소프트웨어가 올바로 동작하는 한 항상 가장 낮은 접근 수준을 부여해야 한다. 

우리가 클래스와 인터페이스에 부여할 수 있는 접근 수준은 package-private인 default와 public 두 가지다. 클래스나 인터페이스를 public 으로 선언하면 공개 API 가 되며, default 로 선언하게 되면 해당 패키지 안에서만 이용할 수 있다. 패키지 외부에서 쓸 이유가 없다면 package - private 으로 선언하자. 그러면 이들은 API 가 아닌 내부 구현이 되어 언제든 수정할 수 있다.

 

클래스의 공개 API 를 세심히 설계한 후, 그 외의 모든 멤버는 private 으로 만들자. 그런 다음 오직 같은 패키지의 다른 클래스가 접근해야 하는 멤버에 한하여 package-private 으로 풀어주자.