접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.
private
default (package-private)
protected
public
모든 외부 호출을 막는다.
같은 패키지 안에서 호출은 허용한다. (키워드는 아무것도 적지 않음)
접근 제어자를 명시하지 않으면 같은 패키지 안에서 호출을 허용하는 default 접근 제어자가 적용된다.
동일한 패키지 내의 다른 클래스에서만 접근이 가능
즉, 나의 패키지 안으로 속성과 기능을 숨기며, 외부 패키지에서 해당 기능을 호출이 불가능하다.
같은 패키지 안에서 호출은 허용, 패키지가 달라도 상속 관계의 호출은 허용한다.
모든 외부 호출을 허용한다.
접근 제어자는 필드와 메서드 그리고 생성자에 사용된다.
추가적으로 클래스 레벨에도 일부 접근 제어자 (public, default)를 사용할 수 있다.
내부 패키지 안의 클래스 안에서 자신의 클래스 안에 선언된 필드들을 다 접근 가능
같은 패키지 안 이지만 외부 클래스에서는 해당 클래스의 default와 public만 접근 가능
외부 패키지에서는 해당 클래스의 public만 접근이 가능
참고로 생성자도 접근 제어자 관점에서의 메서드와 같다.
클래스 레벨의 접근 제어자는 public, default만 사용 가능
public 클래스는 반드시 파일명과 이름이 같아야한다.
하나의 자바 파일에 public 클래스는 하나만 등장할 수 있다 (여러개 x)
하나의 자바 파일에 default 접근 제어자를 사용하는 클래스는 무한정 만들 수 있음
캡슐화(Encapsulation)는 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것을 말한다.
객체 지향 프로그래밍의 중요한 개념 중 하나
캡슐화를 통해 데이터의 직접적인 변경을 방지하거나 제한할 수 있다.
속성(데이터)과 기능(메서드)을 하나로 묶고, 외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨김
캡슐화를 안전하게 완성할 수 있게 만드는 장치가 바로 접근 제어자이다.
객체에는 속성(데이터)와 기능(메서드)이 있다.
캡슐화에서 가장 필수로 숨겨야 하는 것은 속성(데이터)이다.
객체 내부의 데이터를 외부에서 함부로 접근하게 두면 클래스 안에서 데이터를 다루는 모든 로직을 무시하고 데이터를 변경할 수 있기 때문에, 이는 캡슐화가 깨진 것이다.
따라서 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해 접근해야한다.
객체의 기능 중에서 외부에서 사용하지 않고 내부에서만 사용하는 기능들이 있다.
이런 기능도 모두 감추는 것이 좋다.