public
protected
default
private
public
< protected
< default
< private
순으로 접근제한이 강화default
public
// defualt 접근 제한
class 클래스 { ... }
// public 접근 제한
public class 클래스 { ... }
default
접근 제한public
접근 제한같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다
// A.java
package package1;
// default 접근 제한
class A {}
// B.java
package package1;
public class B {
A a; // A클래스 접근 가능 (필드로 선언 가능)
}
// C.java
// 위 두 패키지와 다름
package package2;
// package1 패키지를 import
import package1.*;
public class C {
A a; // (x) A클래스는 default 접근제한 클래스라 접근 불가, 컴파일 에러
B b; // (o)
}
하지만 생성자를 어디에서나 호출 할 수 있는 것은 아니다
생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다
public class ClassName {
// public 접근 제한
public ClassName(...) {...}
// protected 접근 제한
protected ClassName(...) {...}
// default 접근 제한
ClassName(...) {...}
// private 접근 제한
private ClassName(...) {...}
}
public
접근 제한protected
접근 제한default
접근 제한private
접근 제한// A.java
package package1;
public class A {
// 필드
A a1 = new A(true); // (o)
A a2 = new A(1); // (o)
A a3 = new A("문자열"); // (o)
// 생성자
public A(boolean b) {} // public 접근 제한
A(int b) {} // default 접근 제한
private A(String s){} // private 접근 제한
}
// B.java
// 동일 패키지 , 다른 클래스
package package1;
public class B {
// 필드
A a1 = new A(true); // (o)
A a2 = new A(1); // (o)
A a3 = new A("문자열"); // (x) 컴파일 에러 : private 생성자 접근 불가
}
// C.java
// 다른 패키지 , 다른 클래스
package package2;
import package1.A; // pacakge1 import
public class C {
// 필드
A a1 = new A(true); // (o)
A a2 = new A(1); // (x) 컴파일 에러 : default 생성자 접근 불가
A a3 = new A("문자열"); // (x) 컴파일 에러 : private 생성자 접근 불가
}
public
접근 제한protected
접근 제한default
접근 제한private
접근 제한// A.java
package package1;
public class A {
// 필드
public int field1; // public 접근 제한 필드
int field2; // default 접근 제한 필드
private int field3; // private 접근 제한 필드
// 생성자
public A() {
field1 = 1; // (o)
field2 = 1; // (o)
filed3 = 1; // (O)
method1(); // (o)
method2(); // (o)
method3(); // (o)
// 클래스 내부 필드와 내부 메서드는 접근 제한자의 영향을 받지 않음
}
// 메서드
public void method1() {} // public 접근 제한 메서드
void method2() {} // default 접근 제한 메서드
private void method3() {} // private 접근 제한 메서드
}
// B.java
// 동일 패키지
package package1;
public class B {
public B() {
A a = new A(); // A 클래스 접근 가능
a.field1 = 1; // (o) A클래스의 public 필드 접근 가능
a.field2 = 1; // (o) A클래스의 default 필드 접근 가능
a.field3 = 1; // (x) 컴파일 에러 : A클래스의 private 필드 접근 불가
a.method1(); // (o) A클래스의 public 메서드 접근 가능
a.method2(); // (o) A클래스의 default 메서드 접근 가능(같은 패키지)
a.method3(); // (x) 컴파일 에러 : A클래스의 private 메서드 접근 불가
}
}
// C.java
// 다른 패키지
package package2;
import package1.A; // A클래스 import
public class C {
public C() {
A a = new A(); // a 객체 생성 가능 -> A 클래스 접근 가능
a.field1 = 1; // (o) public 필드 접근 가능
a.field2 = 1; // (x) 컴파일 에러 : default 필드 접근 불가
a.field3 = 1; // (x) 컴파일 에러 : private 필드 접근 불가
a.method1(); // (o) public 메서드 접근 가능
a.method2(); // (x) 컴파일 에러 : default 메서드 접근 불가
a.method3(); // (x) 컴파일 에러 : private 메서드 접근 불가
}
}
참고 자료 :
도서 -
혼자 공부하는 자바 - 신용권