제어자란 클래스, 클래스 멤버, 메소드 등의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미한다.
자바에서 제어자는 접근 제어자와 기타 제어자로 구분할 수 있다.
접근 제어자를 사용하여 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉을 할 수 있다.
객체 지향에서 정보 은닉(data hiding)
사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이다.
정보 은닉을 통해 사용자는 알 필요 없는 정보에 헷갈리지 않고 최소한의 정보만으로 프로그램을 손쉽게 사용할 수 있게 된다.
자바에서는 네 가지의 접근 제어자를 제공한다

같은 클래스만 접근 허용
public class SameClass {
private String var = "같은 클래스만 허용"; // private 필드
private String getVar() { // private 메소드
return this.var;
}
}

누구나 접근 허용
public class Everywhere {
public String var = "누구든지 허용"; // public 필드
public String getVar() { // public 메소드
return this.var;
}
}

같은 패키지만 접근 허용
package test;
public class SamePackage {
String sameVar = "같은 패키지는 허용"; // default 필드
}
같은 클래스도 접근 허용
package test;
public class SameClass {
String var = "다른 패키지는 접근 불가"; // default 필드
public static void main(String[] args) {
SamePackage sp = new SamePackage();
System.out.println(sp.sameVar); // 같은 패키지는 허용
}
}
클래스의 protected 멤버에 접근할 수 있는 영역은 아래와 같다.

같은 패키지는 접근 허용
package test;
public class SameClass {
protected String sameVar = "다른 패키지에 속하는 자식 클래스까지 허용"; // protected 필드
}
다른 패키지에 속하는 자식 클래스도 접근 허용
package test.other;
import test.SameClass; // test 패키지의 SameClass 클래스를 불러들여 포함시킴.
public class ChildClass extends SameClass {
public static void main(String[] args) {
SameClass = new SameClass();
System.out.println(sp.sameVar); // 다른 패키지에 속하는 자식 클래스까지 허용
}
}
자바에서 접근 제어자의 접근 범위를 표로 표현하면 다음과 같다.
| 접근 제어자 | 같은 클래스의 멤버 | 같은 패키지의 멤버 | 자식 클래스의 멤버 | 그 외의 영역 |
|---|---|---|---|---|
| public | O | O | O | O |
| protected | O | O | O | X |
| default | O | O | X | X |
| private | O | X | X | X |