Java 접근 제한자 (Access modifiers)
접근 제한자는 public
, protected
, private
등의 수식자의 총칭으로 클래스나 그 멤버가 어디로부터 액세스 가능한가를 결정한다.
접근 제한자
접근 제한자 | 개요 |
---|---|
public |
모든 클래스에서 접근 가능하다. |
protected |
현재의 클래스와 하위 클래스로에서 접근 할 수 있다 |
없음 (default) | 현재의 클래스와 같은 패키지의 클래스로부터 접근 할 수 있다. |
private |
현재 클래스에서만 접근 가능하다. |
접근 제한자를 생략한 상태를 패키지 내부에서만 자유롭게 액세스할 수 있다는 의미에서 패키지 비공개(pacakge private) 라고 한다.
예를 들어, 다음은 각각의 접근 레벨의 동작을 확인할 수 있다.
package com.devkuma.basic.modifier;
public class ModAccess {
public String pubVar = "public";
protected String protVar = "protected";
String packVar = "package private";
private String priVar = "private";
public void test() {
// 클래스 내부에서는 모든 레벨의 맴버로 접근 가능하다.
System.out.println(this.pubVar);
System.out.println(this.protVar);
System.out.println(this.packVar);
System.out.println(this.priVar);
}
public static void main(String[] args) {
ModAccess m = new ModAccess();
m.test();
}
}
실행 결과:
public
protected
package private
private
아래 클래스는 위에 ModAccess의 하위 클래스이다.
package com.devkuma.basic.modifier;
// ModAccess의 하위 클래스
public class ModAccessChild extends ModAccess {
public void test() {
System.out.println(this.pubVar);
System.out.println(this.protVar);
System.out.println(this.packVar);
// System.out.println(this.priVar); // private 변수는 접근 불가능하다.
}
public static void main(String[] args) {
ModAccess mc = new ModAccessChild();
mc.test();
}
}
실행 결과:
public
protected
package private
아래 클래스는 위에 ModAccess와 상속 관계가 없는 다른 패키지 클래스이다.
package com.devkuma.basic.modifier.other;
import com.devkuma.basic.modifier.ModAccess;
// ModAccess와 상속 관계가 없는 다른 패키지 클래스
public class ModAccessOther {
public static void main(String[] args) {
ModAccess my = new ModAccess();
System.out.println(my.pubVar);
// protected 이하의 맴버는 접근 불가능하다.
// System.out.println(my.protVar);
// System.out.println(my.packVar);
// System.out.println(my.priVar);
}
}
실행 결과:
public
접근 제한자를 지정하는 규칙은 단지 “요건을 충족하는 범위에서 가능한 한 좁게 접근 범위를 지정하는 것"이다.
특히, pacakge private와 public
/protected
사이에는 큰 차이가 있다.
pacakge private/private
라는 것은 API가 비공개인 것을 의미하므로, 코드를 수정할 때에도 호환성의 유지 등을 의식할 필요는 없다.
그러나, public
/protected
는 공개 API이므로 사용자에게 주의가 필요하다.
최종 수정 : 2022-10-03