자바에서 접근 지정자(access modifier)는 클래스, 메서드, 변수 등에 대한 접근 범위를 설정하는 키워드입니다. 접근 지정자는 클래스 외부에서 해당 멤버에 대해 어디까지 접근할 수 있는지를 제어합니다. 접근 범위를 설정함으로써 캡슐화(encapsulation)를 강화하고, 코드의 보안성과 유지보수성을 높일 수 있습니다.
접근 지정자는 총 네 가지가 있으며, 각각은 해당 멤버에 대해 접근할 수 있는 범위(동일 패키지, 자식 클래스, 외부 클래스 등)를 제한하거나 허용하는 역할을 합니다. 클래스 설계 시 접근 지정자를 적절히 사용함으로써 데이터 보호, 코드의 모듈화, API의 안정성 등을 보장할 수 있습니다.
public 접근 지정자public으로 선언된 클래스, 메서드, 변수는 모든 곳에서 접근 가능합니다. 즉, 동일 패키지와 다른 패키지에서 모두 접근할 수 있습니다.// 모든 패키지 내에서 해당 클래스 접근 가능 (ex. 객체 생성)
// 다른 패키지에서도 import 후 자유롭게 객체를 생성할 수 있음
public class PublicClass {
// 모든 패키지에서 해당 필드에 접근 가능
public String name;
// 모든 패키지 내에서 해당 메서드 자유롭게 사용 가능
// 다른 패키지에서 해당 객체를 import하고 객체를 생성하고 나서 메서드를 호출
// ex) PublicClass publicClass = new PublicClass();
// publicClass.display(); 이렇게 사용 가능
public void display() {
System.out.println("Public method");
}
}
protected 접근 지정자protected로 선언된 멤버는 동일한 패키지 내에서 자유롭게 접근할 수 있으며, 다른 패키지에 있더라도 해당 클래스를 상속받은 하위 클래스에서는 접근 가능합니다.// ParentClass는 public으로 선언되어 있기 때문에 모든 패키지에서 접근 가능
public class ParentClass {
// protected 필드: 동일 패키지 내에서는 접근 가능하고,
// 다른 패키지에서는 상속받은 자식 클래스에서만 접근 가능
protected String name;
// protected 메서드: 동일 패키지 및 다른 패키지의 자식 클래스에서만 접근 가능
protected void display() {
System.out.println("Protected method");
}
}
// childClass는 ParentClass를 상속받음
public class ChildClass extends ParentClass {
// 자식 클래스에서는 부모 클래스의 protected 필드에 접근 가능
public void showName() {
System.out.println(name); // 상속받은 클래스에서 접근 가능
}
// 자식 클래스는 부모 클래스의 protected 메서드도 호출 가능
public void showDisplay() {
display(); // 부모 클래스의 protected 메서드에 접근 가능
}
}
default 접근 지정자 (package-private)// default 접근 지정자 (접근 지정자를 명시하지 않음)
// 해당 클래스는 동일 패키지 내에서만 접근 가능하고, 다른 패키지에서는 접근 불가
class DefaultClass {
// 필드도 default 접근 지정자
// 동일 패키지 내에서만 접근 가능, 다른 패키지에서는 접근 불가
String name;
// 메서드도 default 접근 지정자
// 동일 패키지 내에서만 접근 가능, 다른 패키지에서는 접근 불가
void display() {
System.out.println("Default method");
}
}
private 접근 지정자private로 선언된 멤버는 동일한 클래스 내에서만 접근이 가능하며, 다른 클래스에서는 접근할 수 없습니다. 상속받은 하위 클래스에서도 접근이 불가능합니다.public class PrivateClass {
// private 필드: 해당 클래스 내에서만 접근 가능
// 외부 클래스나 상속받은 클래스에서도 접근 불가
private String name;
// private 메서드: 해당 클래스 내에서만 호출 가능
// 외부에서 이 메서드를 직접 호출할 수 없음
private void display() {
System.out.println("Private method");
}
// public 메서드: 외부에서 접근 가능
// private 필드에 대한 간접 접근을 허용하는 getter 메서드
public String getName() {
return name; // private 필드인 name을 반환
}
// public 메서드: 외부에서 접근 가능
// private 필드에 값을 설정하는 setter 메서드
public void setName(String name) {
this.name = name; // private 필드인 name에 값을 설정
}
}
자바의 접근 지정자들은 각기 다른 접근 범위를 제공합니다. 다음 표는 접근 가능 여부를 비교한 것입니다.
| 접근 지정자 | 동일 클래스 | 동일 패키지 | 다른 패키지의 자식 클래스 | 그 외의 외부 클래스 |
|---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
public: 모든 곳에서 접근 가능합니다. 클래스, 메서드, 변수 모두에 사용할 수 있습니다.protected: 동일 패키지와 다른 패키지의 하위 클래스에서 접근 가능합니다. 메서드와 변수에만 사용할 수 있으며, 클래스에는 사용이 불가능합니다.default: 동일 패키지에서만 접근 가능합니다. 클래스, 메서드, 변수에 사용할 수 있습니다. 이 지정자는 명시적으로 사용하지 않으며, 접근 지정자가 생략된 경우 적용됩니다.private: 동일 클래스 내에서만 접근 가능합니다. 메서드와 변수에만 사용할 수 있으며, 클래스에는 사용이 불가능합니다. (단, 내부 클래스에는 private을 사용할 수 있습니다.) ->접근 지정자를 적절히 사용하여, 캡슐화와 보호를 구현하는 방법을 예시로 보여드리겠습니다.
public class Account {
private String accountNumber; // 계좌번호 (해당 클래스 내에서만 접근 가능)
private double balance; // 잔액 (해당 클래스 내에서만 접근 가능)
// 생성자: 객체 생성 시 계좌번호와 초기 잔액을 설정
public Account(String accountNumber, double balance) {
this.accountNumber = accountNumber;
this.balance = balance;
}
// private 메서드: 외부에서 계좌번호를 가져올 수 있는 getter 메서드
public String getAccountNumber() {
return accountNumber; // private 필드인 accountNumber 반환
}
// public 메서드: 외부에서 잔액을 가져올 수 있는 getter 메서드
public double getBalance() {
return balance; // private 필드인 balance 반환
}
// public 메서드: 외부에서 입금할 때 사용
// 입금할 금액이 0보다 크면 잔액에 추가
public void deposit(double amount) {
if (amount > 0) {
balance += amount; // 잔액(balance)에 입금 금액 추가
}
}
// public 메서드: 외부에서 출금할 때 사용
// 출금할 금액이 0보다 크고, 잔액이 충분한 경우에만 잔액에서 차감
public void withdraw(double amount) {
if (amount > 0 && balance >= amount) {
balance -= amount; // 잔액(balance)에서 출금 금액 차감
}
}
}
private 필드: 계좌 번호와 잔액은 외부에서 직접 변경할 수 없도록 보호하고, 데이터의 무결성을 유지합니다.public 메서드: 외부에서 접근 가능한 메서드를 통해 계좌 정보를 가져오거나 입출금 작업을 구행할 수 있습니다.자바에서 접근 지정자는 클래스 설계에서 매우 중요한 역할을 하며, 캡슐화와 데이터 보호를 구현하는 데 필수적인 요소입니다. 각 접근 지정자는 클래스, 메서드, 변수의 접근 범위를 제어하며, 개발자는 이를 통해 코드의 가독성, 안정성, 유지보수성을 높일 수 있습니다.