제어자(modifier)란 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미한다.
자바에서 제어자는 접근 제어자(access modifier)와 기타 제어자로 구분할 수 있다.
기타 제어자는 경우에 따라 여러 개를 함께 사용할 수도 있지만, 접근 제어자를 두 개 이상 같이 사용할 수는 없다.
접근 제어자와 기타 제어자는 조합에 따라 함께 사용할 수 있다.
객체 지향에서 정보 은닉(data hiding)이란 개념이 있는데, 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 뜻이다.
(이렇게 함으로써 사용자는 언제나 최소한의 정보만으로 프로그램을 손쉽게 사용 가능)
자바에서는 이러한 정보 은닉을 위해 접근 제어자(access modifier)라는 기능을 제공
접근 제어자는 네 종류가 있으며( private, default, protected, public )
private -> default -> protected -> public순으로 보다 많은 접근을 허용
<private>
접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메서드는 해당 클래스에서만 접근이 가능
public class Sample {
private String secret;
private String getSecret() {
return this.secret;
}
}
// secret 변수와 getSecret 메서드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능
<default>
접근 제어자를 별도로 설정하지 않는다면
접근 제어자가 없는 변수, 메서드는 default 접근 제어자가 되어 해당 패키지 내에서만 접근이 가능
// house/HouseKim.java
package house; // 패키지가 동일하다.
public class HouseKim {
String lastname = "kim"; // lastname은 default 접근제어자로 설정된다.
}
// house/HousePark.java
package house; // 패키지가 동일하다.
public class HousePark {
String lastname = "park";
public static void main(String[] args) {
HouseKim kim = new HouseKim();
System.out.println(kim.lastname); // HouseKim 클래스의 lastname 변수를 사용할 수 있다.
}
}
// HouseKim과 HousePark의 패키지는 house로 동일하다. 따라서 HousePark 클래스에서 HouseKim의 lastname 변수에 접근이 가능
<protected>
protected가 붙은 변수, 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능
// house/HousePark.java
package house; // 아래와 패키지가 서로 다르다.
public class HousePark {
protected String lastname = "park";
}
// house/person/EungYongPark.java
package house.person; // 패키지가 서로 다르다.
import house.HousePark;
public class EungYongPark extends HousePark { // HousePark을 상속했다.
public static void main(String[] args) {
EungYongPark eyp = new EungYongPark();
System.out.println(eyp.lastname); // 상속한 클래스의 protected 변수는 접근이 가능하다.
}
}
하지만, HousePark의 lastname 변수가 protected이기 때문에eyp.lastname과 같은 접근이 가능
lastname의 접근제어자가 protected 가 아닌 default 접근제어자였다면 eyp.lastname 문장은 컴파일 오류가 발생할 수 있는데,
default 접근제어자는 같은 패키지 내에서만 접근할 수 있기 때문이다.
<public>
public 접근제어자가 붙은 변수, 메서드는 어떤 클래스에서라도 접근이 가능
package house;
public class HousePark {
protected String lastname = "park";
public String info = "this is public message.";
}
import house.HousePark;
public class Sample {
public static void main(String[] args) {
HousePark housePark = new HousePark();
System.out.println(housePark.info);
}
}
// 위 HousePark의 info 변수는 public 접근 제어자가 붙어 있으므로 어떤 클래스라도 접근이 가능