클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드
접근 제어자 Vs 기타 제어자로 구분 가능
접근 제어자
기타 제어자
자바에서는 정보 은닉을 위해 접근 제어자라는 기능 제공
정보 은닉이란??
선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근이 불가능
가장 제한적인 범위의 접근 제어자
해당 객체의 public 메소드를 통해서만 접근 가능
public 인터페이스를 직접 구성하지 않고, 클래스 내부의 세부적인 동작을 구현하는데 사용
public class Sample {
private String secret;
private String getSecret() {
return this.secret;
}
}
선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근 가능
해당 객체의 private 멤버에 접근 가능
private 멤버와 프로그램 사이의 인터페이스(interface) 역할 수행
가장 넓은 범위의 접근 제어자
다른 클래스나 모듈에서 재사용 가능한 공개 인터페이스를 제공하기 위해 사용됨
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);
}
} // this is public message. 출력
클래스 및 클래스 멤버의 접근 제어의 기본값
따로 존재하지 않으며, 접근 제어자가 지정되지 않으면 자동으로 defalut 접근 제어를 가지게 됨
같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근 가능
패키지 내에서의 내부적인 구현을 위해 사용됨
package house; // 패키지 동일
public class HouseKim {
String lastname = "kim"; // lastname은 default 접근제어자로 설정된다.
}
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 변수를 사용할 수 있다.
}
} // kim 출력
HouseKim과 HousePark의 패키지는 house로 동일
따라서 HousePark 클래스에서 HouseKim의 lastname 변수에 접근이 가능
패키지 내에서의 내부적인 구현에 사용
접근을 제한하면서도 동일한 패키지 내의 다른 클래스에서 접근이 가능하게 하고자 할 때 사용
부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급됨
이 멤버를 선언한 클래스의 멤버에 접근 가능
이 멤버를 선언한 클래스가 속한 패키지의 멤버에 접근 가능
이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버에 접근 가능
상속과 관련된 기능을 구현하고, 일부 멤벙듸 접근을 제한하여 상속 계층에서의 사용을 조절하기 위해 사용됨
package house; // 서로 다른 패키지
public class HousePark {
protected String lastname = "park";
}
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 변수는 접근이 가능
}
} // park 출력
HousePark 클래스를 상속한 EungYongPark 클래스의 패키지는 house.person으로 HousePark의 패키지인 house와 다르지만 HousePark의 lastname 변수가 protected이기 때문에 eyp.lastname과 같은 접근이 가능
만약 lastname의 접근제어자가 protected 가 아닌 default 접근제어자였다면 eyp.lastname 문장은 컴파일 오류가 발생할 것
접근 제어자 | 같은 클래스의 멤버 | 같은 패키지의 멤버 | 자식 클래스의 멤버 | 그 외의 영역 |
---|---|---|---|---|
public | ○ | ○ | ○ | ○ |
protected | ○ | ○ | ○ | X |
default | ○ | ○ | X | X |
private | ○ | X | X | X |