접근 제어자는 자바에서 클래스, 필드(멤버 변수), 메서드에 대한 접근 범위를 제한하기 위한 키워드이다. 접근 제어자는 캡슐화(Encapsulation)를 구현하는 중요한 요소로, 클래스의 내부 구현을 숨기고 외부로부터 보호하여 데이터의 무결성과 보안성을 유지할 수 있게 한다. 자바에서 제공하는 접근 제어자는 public
, protected
, default
(기본), private
네 가지이다.
private
해당 클래스 내부에서만 접근할 수 있으며, 외부 클래스나 상속받은 자식 클래스에서도 접근할 수 없다.
클래스 내부에서만 관리하고 외부에서는 접근을 차단하고 싶은 경우에 사용한다. 보통 캡슐화를 위해 필드(변수)를 private
로 선언하고, 외부에서 접근할 수 없도록 설정한다.
class Example {
private String secret = "비밀";
private void displaySecret() {
System.out.println(secret);
}
}
public class Main {
public static void main(String[] args) {
Example ex = new Example();
// ex.secret; // 컴파일 에러 (private 접근 불가)
// ex.displaySecret(); // 컴파일 에러 (private 메서드 접근 불가)
}
}
public
어디서든지 접근 가능한 접근 제어자이다. 클래스, 패키지, 상속 관계와 무관하게 모든 클래스에서 접근할 수 있다.
클래스나 메서드를 외부에서 자유롭게 사용할 수 있도록 허용하고 싶을 때 사용한다. 주로 공용 API에 많이 사용된다.
public class Example {
public String name = "공개된 이름";
public void displayName() {
System.out.println(name);
}
}
public class Main {
public static void main(String[] args) {
Example ex = new Example();
System.out.println(ex.name); // public 필드 접근 가능
ex.displayName(); // public 메서드 호출 가능
}
}
protected
같은 패키지 내에서는 자유롭게 접근할 수 있으며, 다른 패키지에 있는 경우에는 상속받은 자식 클래스에서만 접근할 수 있다. 즉, 상속 관계에서는 부모 클래스의 protected
멤버에 접근이 가능하다.
외부에서 무분별한 접근을 막으면서도, 상속 관계에서는 접근을 허용하고 싶을 때 사용한다.
class Parent {
protected String familySecret = "가족 비밀";
}
class Child extends Parent {
void displaySecret() {
System.out.println(familySecret); // protected 접근 가능
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.displaySecret(); // 자식 클래스에서 부모의 protected 멤버에 접근 가능
}
}
default
(기본 접근 제어자)접근 제어자를 명시하지 않은 경우 적용되며, 같은 패키지 내에서만 접근할 수 있다. 패키지 외부에서는 접근이 불가능하다.
외부 패키지에서는 접근할 수 없도록 제한하고, 패키지 내부에서만 사용할 수 있는 클래스나 메서드를 만들 때 사용한다.
class Example {
String packageLevelAccess = "패키지 레벨 접근";
}
public class Main {
public static void main(String[] args) {
Example ex = new Example();
System.out.println(ex.packageLevelAccess); // 같은 패키지 내에서 접근 가능
}
}
private
로 필드를 선언하고, getter와 setter 메서드를 public
으로 만들어 외부에서 안전하게 접근할 수 있다.class Example {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Example ex = new Example();
ex.setAge(30); // setter를 통해 값 설정
System.out.println(ex.getAge()); // getter를 통해 값 가져오기
}
}
private
메서드는 클래스 내부에서만 호출 가능하며, public
메서드는 외부에서 자유롭게 호출할 수 있다. protected
는 상속 관계에서만 외부 접근이 가능하게 설정된다.class Example {
public void publicMethod() {
System.out.println("public 메서드");
}
private void privateMethod() {
System.out.println("private 메서드");
}
}
public class Main {
public static void main(String[] args) {
Example ex = new Example();
ex.publicMethod(); // 호출 가능
// ex.privateMethod(); // 호출 불가 (컴파일 에러)
}
}
접근 제어자 | 같은 클래스 | 같은 패키지 | 상속받은 자식 클래스 | 외부(전체) |
---|---|---|---|---|
private | O | X | X | X |
(default) | O | O | X | X |
protected | O | O | O | X |
public | O | O | O | O |
private
로 선언하고, 외부에서는 getter/setter를 통해 접근하도록 하는 방식으로 정보 은닉을 실현할 수 있다.protected
는 상속을 통해 자식 클래스에서 부모 클래스의 필드와 메서드를 활용할 수 있도록 하여 다형성을 구현할 때 유용하게 사용된다.자바의 접근 제어자는 클래스, 필드, 메서드의 접근 범위를 제한하여 코드의 안전성과 유지보수성을 향상시키는 중요한 기능이다. 각 접근 제어자는 필요에 맞게 적절히 설정하여, 데이터 은닉, 상속, 패키지 관리 등의 다양한 목적을 달성할 수 있다.