private
,package-private
,protected
, public
이다.final
과 관련이 있으며 해당 개념은 아이템 17에 나온다.[핵심 정리]
public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다. 불변 필드라면 노출해도 덜 위험하지만 이 역시도 완전히 안심해서는 안 된다. 하지만 package-private 클래스나 private 중첩 클래스에서는 종종 (불변이든 가변이든)필드를 노출하는 것이 나을 때도 있다.
public class Point {
public int x;
public int y;
}
public
으로 직접 접근할 수 있게 되어 있다.public class Point {
//1. private 접근 제한자로 변경
private int x;
private int y;
//2. 부수 작업을 수행할 메서드 추가
public int getX() {
return x;
}
public int getY() {
return y;
}
}
public
접근 제한자를 사용하던 필드를 모두 private
로 변경public 클래스에서 public 하게 열어둔 필드가 있다고 가정해보자.
- 이때 해당 public class(= Open API)를 사용하려는 클라이언트(=사용자)가 있을 것이고, 해당 필드의 내부 표현 방식을 마음대로 바꿀 수 없게 된다.
- 왜 내부 표현 방식을 마음대로 바꿀 수 없냐 이를 개발자가 마음대로 변경하게 되면 클라이언트가 사용할 때 문제가 생기기 때문이다.
- 그러나 Open API의 필드를
private
하게 만들어 두면 해당 필드는 외부로부터 숨길수 있어서 클라이언트가 이 정보에 대해서 접근할 수 없게 된다.- 이런 상태에서 private한 필드의 내부 표현 방식을 개발자가 변경한다고 한들 이 Open API를 사용하고 있는 클라이언트에겐 아무런 영향이 가지 않는다.
- 내부 표현식을 언제든지 바꿀 수 있는 것은 소프트웨어 개발에서 유연성과 유지보수성을 향상시키는 데에 기여하기 때문에 언제든 변경할 수 있는 것이 이점인 이유다.