자바에서 제어자는 클래스,필드,메서드,생성자 등에 부가적인 의미를 부여하는 키워드
크게 접근 제어자와 기타 제어자로 나눔
접근제어자 : public, protected, (dafault), private
기타제어자 : static, final, abstract, native, transient, synchronized 등
하나의 대상에 여러 제어자를 사용 가능 but 각 대상에 대해서 접근제어자는 단 한번만 사용가능
default는 접근제어자가 안붙어 있을 경우를 뜻함
public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)
package package1; // 패키지명 package1
//파일명: Parent.java
class Test { // Test 클래스의 접근 제어자는 default
public static void main(String[] args) { // 같은패키지이지만 동일 클래스가 아닐 때
Parent p = new Parent();
// System.out.println(p.a); // 동일 클래스가 아니기 때문에 에러발생!
System.out.println(p.b);
System.out.println(p.c);
System.out.println(p.d);
}
}
public class Parent { // Parent 클래스의 접근 제어자는 public
private int a = 1; // a,b,c,d에 각각 private, default, protected, public 접근제어자 지정
int b = 2;
protected int c = 3;
public int d = 4;
public void printEach() { // 동일패키지 동일 클래스일 때
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
package package2; // package2
//파일명 Test2.java
import package1.Parent;
class Child extends package1.Parent { // package1으로부터 Parent 클래스를 상속
패키지는 다르지만 하위 클래스일때
public void printEach() {
// System.out.println(a); // 같은 클래스일때만 가능
// System.out.println(b); // 같은 패키지일때만 가능
System.out.println(c); // 같은 패키지 or 하위 클래스에서 가능
System.out.println(d); // 다 가능
}
}
public class Test2 { // 패키지, 클래스 다 다들때
public static void main(String[] args) {
Parent p = new Parent();
// System.out.println(p.a); // public을 제외한 모든 호출 에러!
// System.out.println(p.b);
// System.out.println(p.c);
System.out.println(p.d);
}
}