접근 제한자에 관하여
Java에서는 접근 제한자(Access Modifiers) 를 사용하여 클래스, 변수, 메서드 등에 대한 접근 범위를 제어할 수 있습니다. 이를 통해 객체 지향 프로그래밍의 캡슐화(Encapsulation) 원칙을 적용할 수 있으며, 코드의 보안성과 유지보수성을 높일 수 있습니다. 이번 글에서는 Java의 접근 제한자에 대해 자세히 알아보겠습니다.
1. Java 의 접근 제한자 종류
Java 에서는 네 가지 접근 제한자를 제공합니다:
접근 제한자같은 클래스같은 패키지자식 클래스(상속)다른 패키지
| public | ✅ 가능 | ✅ 가능 | ✅ 가능 | ✅ 가능 |
| protected | ✅ 가능 | ✅ 가능 | ✅ 가능 | ❌ 불가능 |
| default | ✅ 가능 | ✅ 가능 | ❌ 불가능 | ❌ 불가능 |
| private | ✅ 가능 | ❌ 불가능 | ❌ 불가능 | ❌ 불가능 |
각 접근 제한자의 특징과 사용법을 살펴보겠습니다.
2. public (공개 범위: 모든 곳)
public 키워드를 사용하면 모든 클래스에서 접근 가능합니다.
package mypackage;
public class PublicExample {
public void display() {
System.out.println("Public method called");
}
}
import mypackage.PublicExample;
public class Main {
public static void main(String[] args) {
PublicExample obj = new PublicExample();
obj.display(); // 가능
}
}
✅ public 메서드는 같은 패키지뿐만 아니라 다른 패키지에서도 접근 가능합니다.
3. protected (공개 범위: 같은 패키지 + 상속 관계 클래스)
protected 키워드는 같은 패키지 내에서는 자유롭게 접근 가능하지만, 다른 패키지에서는 상속받은 클래스에서만 접근할 수 있습니다.
package mypackage;
public class ProtectedExample {
protected void show() {
System.out.println("Protected method called");
}
}
package anotherpackage;
import mypackage.ProtectedExample;
public class SubClass extends ProtectedExample {
public static void main(String[] args) {
SubClass obj = new SubClass();
obj.show(); // 가능 (상속 관계이므로 접근 가능)
}
}
🚫 ProtectedExample 을 직접 객체로 생성하고 show() 를 호출하면 컴파일 오류가 발생합니다. ✅ 하지만 SubClass 가 ProtectedExample 을 상속받은 경우, show() 메서드에 접근할 수 있습니다.
4. default (공개 범위: 같은 패키지)
default 접근 제한자는 아무 키워드도 사용하지 않은 경우 적용됩니다. 같은 패키지 내에서는 접근 가능하지만, 다른 패키지에서는 접근할 수 없습니다.
package mypackage;
class DefaultExample {
void display() {
System.out.println("Default method called");
}
}
package anotherpackage;
import mypackage.DefaultExample;
public class Main {
public static void main(String[] args) {
DefaultExample obj = new DefaultExample(); // 오류 발생
obj.display();
}
}
🚫 DefaultExample 클래스는 같은 패키지 내에서만 접근할 수 있으며, 다른 패키지에서는 접근할 수 없습니다.
5. private (공개 범위: 같은 클래스 내부에서만 사용 가능)
private 키워드는 해당 클래스 내부에서만 접근 가능하도록 제한합니다. 다른 클래스에서는 접근할 수 없습니다.
class PrivateExample {
private void secretMethod() {
System.out.println("Private method called");
}
public void accessSecret() {
secretMethod(); // 같은 클래스 내부에서는 호출 가능
}
}
public class Main {
public static void main(String[] args) {
PrivateExample obj = new PrivateExample();
obj.secretMethod(); // 오류 발생
}
}
🚫 secretMethod() 는 private 으로 선언되어 외부 클래스에서 직접 접근할 수 없습니다. ✅ 하지만 같은 클래스 내부의 accessSecret() 메서드를 통해 호출하면 사용할 수 있습니다.
6. 접근 제한자의 활용 및 권장 사항
6.1 캡슐화 (Encapsulation) 와 접근 제한자
- private을 사용하여 직접적인 데이터 접근을 제한하고, public 메서드를 통해 데이터를 조작하도록 설계하면 **캡슐화(Encapsulation)**를 효과적으로 적용할 수 있습니다.
- 예제:
class Person {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
✅ private 필드를 getter와 setter 메서드를 통해 조작하면 데이터 보호와 유효성 검사가 가능합니다.
6.2 접근 제한자 선택 가이드
- 클래스 레벨
- 대부분 public을 사용하지만, 내부적으로만 사용하는 클래스는 default를 사용할 수 있음.
- 필드(변수) 레벨
- 데이터 보호를 위해 private을 기본으로 사용하고, 필요한 경우 getter와 setter를 제공.
- 메서드 레벨
- public: 외부에서 호출해야 하는 경우.
- protected: 서브클래스에서만 접근할 필요가 있는 경우.
- private: 내부적으로만 사용되는 경우.
7. 마무리
- Java의 접근 제한자는 public, protected, default, private 네 가지가 있다.
- public은 모든 곳에서 접근 가능하지만, private은 같은 클래스 내에서만 접근 가능하다.
- protected는 같은 패키지 또는 상속받은 클래스에서만 접근할 수 있다.
- default는 같은 패키지 내에서만 접근 가능하다.
- 적절한 접근 제한자를 선택하면 캡슐화를 강화하고 코드의 보안성과 유지보수성을 높일 수 있다.