자바의 접근 제어자(Access Modifier는 변수나 메소드를 선언할 때 접근을 제어할 수 있는 권한을 설정하는 것이다. 접근 제어자를 통해 객제지향 언어의 중요 특성인 캡슐화(Encapsulation)를 구현할 수 있다.
<캡슐화>
객체에 직접적인 접근을 막아 내부의 정보를 은닉하고, 객체가 제공하는 필드와 메소드를 통해서 접근이 가능하게 한 것
자바의 접근 제어자는 다음과 같이 4가지가 있다.
public - protected - default - private 순으로 접근이 점차 제한된다.
접근 제어자 중 가장 제한이 강한 제어자로 private
이 붙으면 해당 class 내에서만 접근이 가능하다.
public class Sample {
private String secret;
private String getSecret() {
return this.secret;
}
}
위 예제의 secret 변수와 getSecret(() 메소드는 오직 Sample 클리스에서만 접근할 수 있다.
public
으로 선언된 class 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 접근이 가능하다.
접근 제어자를 별도로 설정하지 않을 경우 default
접근 제어자로 설정된다. default
접근 제어자는 같은 패키지 내에서만 접근이 가능하다.
house/House_yu.java
package house;
public class House_yu {
String lastName = "Yu";
}
house/House_kim.java
package house;
public class House_kim {
String lastName = "Kim";
public static void main(String[] a rgs) {
House_yu yu = new House_yu();
System.out.println(yu.lastName);
// Houst_yu 클래스의 변수 lastName에 접근 가능
// Yu
}
}
위의 예제에서 두 클래스(House_yu, House_kim)의 패키지는 house
로 동일하기 때문에 House_yu 클래스 변수 lastName에 접근이 가능했다.
protected
접근 제어자가 접근할 수 있는 영역은 다음과 같다.
protected
를 선언한 클래스 내부protected
를 선언한 클래스가 속한 패키지protected
를 선언한 클래스를 상속받은 다른 패키지의 자식 클래스house/House_yu.java
package house;
public class House_yu {
protected String lastname = "Yu";
}
house/person/Hyemco.java
package house.person;
import house.House_yu;
public class Hyemco extends House_yu { // House_yu 상속
public static void main(String[] args) {
Hyemco name = new Hyemco();
System.out.println(name.lastname);
// Yu
}
}
House_yu
클래스와 이 클래스를 상속한 Hyemco
클래스 패키지는 서로 다르지만, House_yu
의 변수 lastname이 protected 접근 제어자를 가졌기 때문에 다른 패키지이지만 상속받은 자식 클래스 Hyemco
에서 name.lastname
접근이 가능했다.
만약, default 접근 제어자였다면 name.lastname
에서 컴파일 오류가 발생할 것이다.