접근 제한자의 종류 - public, protected, default, private
※ default는 별도의 키워드를 지정하지 않을 때 적용되는 기본 접근 제한자이다.
1) public (공개, 어디서든 접근 가능)
- 모든 클래스에서 접근 가능하다
- 패키지가 달라져도 접근이 가능하며, 가장 개방적인 접근 제한자이다.
package test;
public class PublicExample {
public void display() {
System.out.println("public 메서드 호출!");
}
}
package other;
import test.PublicExample;
public class Main {
public static void main(String[] args) {
PublicExample example = new PublicExample();
example.display(); // 다른 패키지에서도 접근 가능!
}
}
실무 사용 예시
- 라이브러리나 프레임워크에서 공개 API를 제공할 때 public을 사용한다.
- 서비스 계층(Service Layer)에서 비즈니스 로직을 구현한 메서드는 public으로 선언된다.
2) protected (같은 패키지 + 상속 관계에서 접근 가능)
- 같은 패키지 내에서는 자유롭게 접근할 수 있다.
- 패키지가 다른 경우, 자식 클래스에서만 접근 가능하다.
- 주로 상속을 활용할 때 유용하다.
package test;
public class ProtectedExample {
protected void showMessage() {
System.out.println("protected 메서드 호출!");
}
}
package other;
import test.ProtectedExample;
public class Main extends ProtectedExample {
public static void main(String[] args) {
Main obj = new Main();
obj.showMessage(); // 가능 (상속받은 클래스이므로 접근 가능)
}
}
실무 사용 예시
- 부모 클래스의 기능을 자식 클래스에서만 활용하고 싶을 때 사용
- 프레임워크 내부에서 상속을 통해 확장할 수 있도록 설계된 클래스에서 활용
3) default (패키지 내부에서만 접근가능)
- 접근 제한자를 명시하지 않으면 기본값(default)이 적용
- 같은 패키지 내에서는 접근 가능하지만, 다른 패키지에서는 접근 불가
package test;
class DefaultExample {
void sayHello() {
System.out.println("default 메서드 호출!");
}
}
package other;
import test.DefaultExample;
public class Main {
public static void main(String[] args) {
DefaultExample obj = new DefaultExample(); // 오류 발생! (같은 패키지가 아니므로 접근 불가)
obj.sayHello();
}
}
실무 사용 예시
- 패키지 내부에서만 사용될 유틸리티 클래스나 헬터(helper)클래스에 활용
- 패키지 외부에서 불필요한 접근을 제한할 때 사용
4) private (자신의 클래스에서만 접근 가능)
- 해당 클래스 내부에서만 접근 가능하며, 외부에서는 접근할 수 없다
- 가장 제한적인 접근 제한자로, 데이터 보호 및 캡슐화에 유용하다.
package test;
public class PrivateExample {
private String secret = "이것은 비밀 데이터입니다!";
private void displaySecret() {
System.out.println(secret);
}
public void accessSecret() {
displaySecret(); // 같은 클래스 내부에서는 호출 가능
}
}
package other;
import test.PrivateExample;
public class Main {
public static void main(String[] args) {
PrivateExample obj = new PrivateExample();
obj.accessSecret(); // public 메서드를 통해 간접적으로 접근 가능!
// obj.secret; // 오류 발생! (private 변수 직접 접근 불가)
// obj.displaySecret(); // 오류 발생! (private 메서드 직접 호출 불가)
}
}
실무 사용 예시
- 객체의 데이터를 외부에서 직접 변경하지 못하도록 보호할 때 사용
- getter/setter를 통해 필요한 경우에만 데이터를 노출하는 방식으로 사용
'CS' 카테고리의 다른 글
| CheckedException, UncheckedException (0) | 2025.03.04 |
|---|---|
| 객체지향 프로그래밍의 특징 (0) | 2025.03.04 |
| 객체 지향의 설계원칙 (OOP) (0) | 2025.03.04 |
| 직렬화와 역직렬화 (2) | 2025.03.04 |
| 오버로딩(Overloading)과 오버라이딩(Overriding) (0) | 2025.02.25 |