Java는 private, (default), protected, public 4종류의 접근 제어자가 있다.
4종류의 접근 제어자는 변수, 메서드, 클래스에 모두 적용 가능하다.
private
private은 오직 선언한 클래스 내부에서만 사용할 수 있다.
private 변수 선언문;
public class test {
public static void main(String[] args){
Sample sample = new Sample();
sample.printNum(); // 3
System.out.println(sample.num); // java: num has private access in Sample
}
}
class Sample {
private int num = 3;
void printNum() {
System.out.println(this.num);
}
}
Sample 클래스 내에 선언된 private 변수인 num은 Sample 클래스 내에서만 사용 가능하다. (예: printNum 메서드) 하지만 test의 main 메서드에서는 Sample 클래스의 num에 접근하지 못하고 에러가 발생한다.
default
default는 접근 제어자를 작성하지 않았을 때를 뜻한다. default는 같은 패키지의 멤버라면 사용 가능하다.
// path: test/test2.py
package test;
class Sample {
int num = 3;
}
test 패키지에서 Sample 클래스의 num을 선언했다.
// path: test/test.java
package test;
public class test {
public static void main(String[] args){
Sample sample = new Sample();
System.out.println(sample.num); // 3
}
}
그리고 같은 패키지의 다른 파일에서 접근해보니 정상적으로 접근할 수 있었다.
이번에는 다른 패키지에서 접근해 보았다.
// path: test/Sample.java
package test;
public class Sample {
int num = 3;
}
test라는 패키지에서 Sample.num를 선언했다.
// path: main.java
import test.Sample;
public class main {
public static void main(String[] args) {
Sample sample = new Sample();
System.out.println(sample.num);
// java: num is not public in test.Sample;
}
}
그리고 패키지 외부에서 접근해보면 에러가 발생한다.
protected
protected는 클래스의 상속을 받은 자식 클래스에서 접근이 가능하다.
protected 변수 선언문;
class Parent {
// 부모 클래스
protected int num = 3;
}
class Child extends Parent {
// 자식 클래스
void printNum() {
System.out.println(super.num); // 3
}
}
Parent를 상속 받은 Child 클래스는 protected된 변수에 접근할 수 있다.
public
public은 위에서 봤던 범위를 포함한 모든 곳에서 접근이 가능하다.
public 변수 선언문;
public class main {
public static void main(String[] args){
System.out.println("Main Function.");
}
}