Java의 접근 제어자(private, default, protected, public)는 클래스, 변수, 메서드, 생성자 등에 대한 접근 범위를 제어하며, 각각의 특징과 용도가 다르다.
- 가장 제한적인 접근 제어자입니다.
- 동일 클래스 내에서만 접근할 수 있으며, 외부 클래스나 상속받은 클래스에서도 접근할 수 없습니다.
- 외부 클래스에서 접근할 필요가 없는 데이터를 보호하고, 캡슐화(Encapsulation)를 구현하는 데 주로 사용됩니다.
- 외부로부터 데이터나 메서드를 숨겨야 할 때 사용됩니다.
- 클래스 내부에서만 접근 가능하므로, 데이터 무결성을 유지하는 데 도움을 줍니다.
public class Example {
private int secretValue = 42; // private 변수
private void displaySecret() { // private 메서드
System.out.println("Secret Value: " + secretValue);
}
public void showSecret() {
// private 메서드는 클래스 내부에서만 호출 가능
displaySecret();
}
}
class Test {
public static void main(String[] args) {
Example ex = new Example();
// ex.secretValue; // 에러: private 변수에 접근 불가
// ex.displaySecret(); // 에러: private 메서드에 접근 불가
ex.showSecret(); // 가능: public 메서드로 간접 접근
}
}
- 같은 패키지 내에서는 default처럼 접근이 가능하며, 다른 패키지에 속한 하위 클래스에서도 접근이 가능합니다.
- 상속을 통해 재사용할 가능성이 있는 메서드와 변수를 보호할 때 사용됩니다.
- 다른 패키지에서 접근하려면 반드시 상속받은 클래스여야 합니다.
- 패키지 외부의 일반 클래스에서는 접근이 불가능합니다.
- 부모 클래스의 멤버를 하위 클래스에서 재정의(Override)하거나 활용할 때 사용됩니다.
package parent;
public class Parent {
protected int protectedValue = 100; // protected 변수
protected void displayValue() { // protected 메서드
System.out.println("Protected Value: " + protectedValue);
}
}
package child;
import parent.Parent;
public class Child extends Parent {
public void useProtected() {
// 하위 클래스에서는 부모 클래스의 protected 멤버에 접근 가능
displayValue();
}
}
class Test {
public static void main(String[] args) {
Child child = new Child();
child.useProtected(); // 가능
// child.protectedValue; // 에러: 직접 접근 불가능
}
}
- 가장 개방적인 접근 제어자입니다.
- 어디서나 접근 가능하며, 패키지와 클래스의 경계를 넘어서 사용할 수 있습니다.
- 주로 클래스나 메서드를 외부로 노출하여 다른 클래스와 상호작용할 수 있도록 설계할 때 사용됩니다.
- 모든 클래스, 모든 패키지에서 자유롭게 접근 가능.
- 일반적으로 API, 유틸리티 클래스, 공용 메서드, 생성자 등에 사용됩니다.
public class Example {
public int publicValue = 50; // public 변수
public void displayPublic() { // public 메서드
System.out.println("Public Value: " + publicValue);
}
}
class Test {
public static void main(String[] args) {
Example ex = new Example();
ex.displayPublic(); // 어디서나 접근 가능
}
}
- 접근 제어자를 명시하지 않은 경우 적용되는 기본 접근 제어자입니다.
- 같은 패키지 내에서만 접근할 수 있습니다.
- 다른 패키지에서는 접근이 불가능합니다.
- 같은 패키지에 속한 클래스 간의 협력을 위해 주로 사용됩니다.
- 외부에서 노출할 필요는 없지만, 같은 패키지 내에서 공용으로 사용할 수 있을 때 적합합니다.
- 별도의 키워드가 없으며, 단순히 접근 제어자를 생략하면 됩니다.
class Example { // default 클래스
int defaultValue = 10; // default 변수
void display() { // default 메서드
System.out.println("Default Value: " + defaultValue);
}
}
class Test {
public static void main(String[] args) {
Example ex = new Example();
ex.display(); // 같은 패키지 내에서는 접근 가능
}
}
// 다른 패키지의 클래스에서는 Example 및 그 멤버에 접근 불가
접근 제어자 | 접근 가능 범위 | 주요 용도 |
private | 같은 클래스 내에서만 접근 가능 | 데이터 보호 및 캡슐화 |
default | 같은 패키지 내에서 접근 가능 | 패키지 내 협력 클래스 |
protected | 같은 패키지 또는 다른 패키지의 하위 클래스에서 접근 가능 | 상속 관계에서의 보호 및 재사용성 제공 |
public | 모든 클래스에서 접근 가능 | 공용 API 및 외부 인터페이스 |
[JAVA] 자바 21 버전 특징 및 새로운 기능 (0) | 2024.11.28 |
---|---|
[JAVA] User-Agent를 통해서 PC/MOBILE 구분하는 방법 (0) | 2022.11.01 |
[JAVA] UUID 클래스 고유식별자, RANDOM 데이터 추출 (0) | 2022.05.10 |
[JAVA] 문자열 마지막 콤마 제거하기(꿀팁) (0) | 2022.01.18 |
[JAVA] 문자열 대소문자로 변환하는 가장 쉬운 방법(꿀팁) (0) | 2022.01.17 |