1. 접근 지정자란?
자바에서 접근 지정자(access modifier)는 클래스, 메서드, 변수 등에 대한 접근 범위를 설정하는 키워드입니다. 접근 지정자는 클래스 외부에서 해당 멤버에 대해 어디까지 접근할 수 있는지를 제어합니다. 접근 범위를 설정함으로써 캡슐화(encapsulation)를 강화하고, 코드의 보안성과 유지보수성을 높일 수 있습니다.
접근 지정자는 총 네 가지가 있으며, 각각은 해당 멤버에 대해 접근할 수 있는 범위(동일 패키지, 자식 클래스, 외부 클래스 등)를 제한하거나 허용하는 역할을 합니다. 클래스 설계 시 접근 지정자를 적절히 사용함으로써 데이터 보호, 코드의 모듈화, API의 안정성 등을 보장할 수 있습니다.
2. 접근 지정자의 종류
2.1 public
접근 지정자
- 정의:
public
으로 선언된 클래스, 메서드, 변수는 모든 곳에서 접근 가능합니다. 즉, 동일 패키지와 다른 패키지에서 모두 접근할 수 있습니다. - 사용 시기: 클래스나 메서드가 외부에서 자유롭게 사용되기를 원할 때, 특히 API나 라이브러리의 공개된 기능을 제공하는 경우에 사용합니다.
// 모든 패키지 내에서 해당 클래스 접근 가능 (ex. 객체 생성)
// 다른 패키지에서도 import 후 자유롭게 객체를 생성할 수 있음
public class PublicClass {
// 모든 패키지에서 해당 필드에 접근 가능
public String name;
// 모든 패키지 내에서 해당 메서드 자유롭게 사용 가능
// 다른 패키지에서 해당 객체를 import하고 객체를 생성하고 나서 메서드를 호출
// ex) PublicClass publicClass = new PublicClass();
// publicClass.display(); 이렇게 사용 가능
public void display() {
System.out.println("Public method");
}
}
2.2. 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 메서드에 접근 가능
}
}
2.3 default
접근 지정자 (package-private)
- 정의: 접근 지정자를 명시하지 않을 때 자동으로 적용되는 접근 수준입니다. 동일한 패키지 내에서만 접근이 가능하며, 다른 패키지에서는 접근할 수 없습니다.
- 사용 시기: 패키지 내부에서만 접근을 허용하고, 패키지 외부로 노출되지 않도록 하고 싶을 때 사용합니다.
// default 접근 지정자 (접근 지정자를 명시하지 않음)
// 해당 클래스는 동일 패키지 내에서만 접근 가능하고, 다른 패키지에서는 접근 불가
class DefaultClass {
// 필드도 default 접근 지정자
// 동일 패키지 내에서만 접근 가능, 다른 패키지에서는 접근 불가
String name;
// 메서드도 default 접근 지정자
// 동일 패키지 내에서만 접근 가능, 다른 패키지에서는 접근 불가
void display() {
System.out.println("Default method");
}
}
2.4 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에 값을 설정
}
}
3. 접근 지정자 비교
자바의 접근 지정자들은 각기 다른 접근 범위를 제공합니다. 다음 표는 접근 가능 여부를 비교한 것입니다.
접근 지정자 | 동일 클래스 | 동일 패키지 | 다른 패키지의 자식 클래스 | 그 외의 외부 클래스 |
---|---|---|---|---|
public |
O | O | O | O |
protected |
O | O | O | X |
default |
O | O | X | X |
private |
O | X | X | X |
3.1 요약
public
: 모든 곳에서 접근 가능합니다. 클래스, 메서드, 변수 모두에 사용할 수 있습니다.protected
: 동일 패키지와 다른 패키지의 하위 클래스에서 접근 가능합니다. 메서드와 변수에만 사용할 수 있으며, 클래스에는 사용이 불가능합니다.default
: 동일 패키지에서만 접근 가능합니다. 클래스, 메서드, 변수에 사용할 수 있습니다. 이 지정자는 명시적으로 사용하지 않으며, 접근 지정자가 생략된 경우 적용됩니다.private
: 동일 클래스 내에서만 접근 가능합니다. 메서드와 변수에만 사용할 수 있으며, 클래스에는 사용이 불가능합니다. (단, 내부 클래스에는private
을 사용할 수 있습니다.) ->
4. 접근 지정자 활용 예시
4.1 클래스 설계에서의 활용
접근 지정자를 적절히 사용하여, 캡슐화와 보호를 구현하는 방법을 예시로 보여드리겠습니다.
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)에서 출금 금액 차감
}
}
}
4.2 예시를 통해 확인한 접근 지정자의 선택
private
필드: 계좌 번호와 잔액은 외부에서 직접 변경할 수 없도록 보호하고, 데이터의 무결성을 유지합니다.public
메서드: 외부에서 접근 가능한 메서드를 통해 계좌 정보를 가져오거나 입출금 작업을 구행할 수 있습니다.
이러한 설계를 통해 캡슐화가 이루어지며, 내부 데이터를 보호하면서 외부에서는 필요한 기능만 사용하도록 제한할 수 있습니다.
5. 결론
자바에서 접근 지정자는 클래스 설계에서 매우 중요한 역할을 하며, 캡슐화와 데이터 보호를 구현하는 데 필수적인 요소입니다. 각 접근 지정자는 클래스, 메서드, 변수의 접근 범위를 제어하며, 개발자는 이를 통해 코드의 가독성, 안정성, 유지보수성을 높일 수 있습니다.
'BackEnd > JAVA' 카테고리의 다른 글
[JAVA] try-with-resources 정리 (0) | 2025.01.19 |
---|---|
[JAVA] 자바 부모클래스 및 인터페이스 심화: 오버라이딩과 메서드 동작 (0) | 2025.01.17 |
[JAVA] 인터페이스 정리 (0) | 2025.01.12 |
[JAVA] 추상 클래스 (Abstract Class) 정리 (0) | 2025.01.09 |
[JAVA] 자바에서 main 메서드가 static인 이유 (0) | 2025.01.06 |