Java에서의 접근 제어자(Access Modifiers)
Java의 접근 제어자는 클래스, 메서드, 변수 등에 대한 접근 범위(사용 권한)를 제어하는 데 사용됩니다.
이를 통해 캡슐화를 구현하고, 코드의 보안성과 유지 보수성을 높일 수 있습니다.
주요 접근 제어자인 Public, Private, Protected 에 대해 알아볼게요.
1. 접근 제어자의 종류와 특징
1.1 public
- 설명: public으로 지정된 멤버는 어디서든 접근 가능합니다.
- 사용 위치: 클래스, 메서드, 필드(변수)
- 특징:
- 같은 패키지와 다른 패키지의 클래스에서도 접근할 수 있습니다.
- 주로 공용 API나 라이브러리를 작성할 때 사용됩니다.
public class PublicExample {
public String message = "Hello, World!";
public void printMessage() {
System.out.println(message);
}
}
1.2 protected
- 설명: protected 멤버는 같은 패키지와 **서브클래스(상속 관계)**에서만 접근 가능합니다.
- 사용 위치: 메서드, 필드
- 특징:
- 상속을 통해 하위 클래스에서 접근할 수 있지만, 외부 클래스에서는 직접 접근이 불가능합니다.
- 주로 상속 구조에서 상위 클래스의 멤버를 하위 클래스에서 사용하도록 허용할 때 유용합니다.
package example;
public class Parent {
protected String message = "Hello from Parent";
protected void showMessage() {
System.out.println(message);
}
}
class Child extends Parent {
public void display() {
showMessage(); // 상속받은 protected 메서드 접근 가능
}
}
1.3 default (package-private)
- 설명: 접근 제어자를 명시하지 않은 경우, 기본값은 default이며 같은 패키지 내에서만 접근 가능합니다.
- 사용 위치: 클래스, 메서드, 필드
- 특징:
- 외부 패키지에서는 접근이 불가능합니다.
- 같은 프로젝트 내에서 특정 모듈 간의 협업을 위해 사용됩니다.
class DefaultExample {
String message = "Default Access Modifier";
void printMessage() {
System.out.println(message);
}
}
1.4 private
- 설명: private 멤버는 클래스 내부에서만 접근 가능합니다.
- 사용 위치: 메서드, 필드
- 특징:
- 외부 클래스 또는 하위 클래스에서는 접근할 수 없습니다.
- 주로 캡슐화를 위해 사용되며, 외부에 노출되어서는 안 되는 데이터를 보호합니다.
public class PrivateExample {
private String secret = "This is private!";
private void printSecret() {
System.out.println(secret);
}
public void accessSecret() {
printSecret(); // 내부에서만 접근 가능
}
}
2. 접근 제어자의 비교
접근 제어자 | 동일클래스 | 동일패키지 | 하위 클래스 상속 관계 (다른 패키지) |
외부 클래스 다른 패키지 |
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
3. 활용 사례
- 캡슐화를 통한 보안 강화
- 클래스의 내부 데이터(private)를 숨기고, 접근 메서드(getter, setter)를 통해 필요한 경우에만 데이터를 제공.
public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
- 상속 구조에서 데이터 보호
- protected를 사용하여 하위 클래스에서만 데이터를 공유.
public class Animal { protected String sound; public void makeSound() { System.out.println(sound); } } public class Dog extends Animal { public Dog() { this.sound = "Bark"; } }
- 모듈화된 코드 설계
- default를 사용하여 패키지 간의 불필요한 접근을 제한.
4. 주의사항
- 최소 권한 원칙
- 클래스 또는 멤버는 필요한 최소한의 접근 수준만 허용해야 합니다.
- 예: 외부에서 사용할 필요가 없다면 private 또는 default로 지정.
- 상속 사용 시 protected의 오용 주의
- protected 멤버가 많아지면 하위 클래스에서 지나치게 많은 정보를 노출할 위험이 있습니다.
- API 설계 시 public의 남용 금지
- public 멤버가 많아질수록 변경 시 호환성 문제가 발생할 가능성이 높아집니다.
댓글