접근 제어자는 클래스, 메서드, 변수 등의 접근 범위를 제한하기 위해 사용된다. 이들은 객체 지향 프로그래밍의 캡슐화 원칙을 지원하는 기능 중 하나이다.
**//캡슐화란, 클래스의 내부 데이터를 외부에서 직접 접근하지 못하게 하여 인터페이스만을 통해 데이터를 접근할 수 있게 하는 것을 의미한다.
public으로 선언된 멤버(클래스, 메서드, 변수 등)는 어떤 클래스에서든지 접근할 수 있다.
public class PublicExample {
public int publicNumber; // 어디서든 접근 가능한 변수
public void showNumber() {
System.out.println("Public Number: " + publicNumber);
}
}
class TestPublic {
public static void main(String[] args) {
PublicExample example = new PublicExample();
example.publicNumber = 10; // 다른 클래스에서 접근 가능
example.showNumber(); // 다른 클래스에서 접근 가능
}
}
private으로 선언된 멤버는 해당 멤버가 선언된 클래스 내부에서만 접근할 수 있다.
주로 클래스 내부에서만 사용되는 보조 메서드나 변수에 사용된다.
public class PrivateExample {
private int privateNumber; // 같은 클래스 내에서만 접근 가능한 변수
public void setPrivateNumber(int number) {
this.privateNumber = number;
}
public void showNumber() {
System.out.println("Private Number: " + privateNumber);
}
}
class TestPrivate {
public static void main(String[] args) {
PrivateExample example = new PrivateExample();
example.setPrivateNumber(20); // 외부에서 private 멤버에 접근하기 위한 public 메서드 사용
example.showNumber();
}
}
접근 제어자를 명시적으로 지정하지 않으면, default 접근 수준을 가진다.
이는 같은 패키지 내의 클래스만 접근할 수 있다. 즉, 다른 패키지에서는 접근할 수 없다.
class DefaultExample { // 접근 제어자를 명시하지 않음, package-private 클래스
int defaultNumber; // 같은 패키지 내에서만 접근 가능
void showNumber() {
System.out.println("Default Number: " + defaultNumber);
}
}
class TestDefault {
public static void main(String[] args) {
DefaultExample example = new DefaultExample();
example.defaultNumber = 30; // 같은 패키지 내에서 접근 가능
example.showNumber();
}
}
protected 접근 제어자는 같은 패키지 내의 클래스 또는 다른 패키지의 자식 클래스에서 접근할 수 있다.
public class ProtectedExample {
protected int protectedNumber; // 같은 패키지 또는 다른 패키지의 자식 클래스에서 접근 가능
protected void showNumber() {
System.out.println("Protected Number: " + protectedNumber);
}
}
class TestProtected extends ProtectedExample {
public static void main(String[] args) {
TestProtected example = new TestProtected();
example.protectedNumber = 40; // 상속받은 클래스에서 접근 가능
example.showNumber(); // 상속받은 클래스에서 접근 가능
}
}
public: 어디서든 접근 가능.
private: 같은 클래스 내에서만 접근 가능.
default (package-private): 같은 패키지 내에서만 접근 가능.
protected: 같은 패키지 내 또는 다른 패키지의 자식 클래스에서 접근 가능.