학습
Java 접근 제어자
Java 접근 제어자 — 초급
접근 제어자
1. 도입 (왜 배워야 하는가)
접근 제어자는 객체 지향 프로그래밍에서 매우 중요한 개념입니다. 객체 지향 프로그래밍의 핵심은 캡슐화로, 이는 객체의 내부 상태와 구현을 숨기고 외부에서 접근할 수 있는 방법을 제어하는 것입니다. 접근 제어자를 이해하지 못하면 클래스의 데이터와 메서드에 대한 잘못된 접근이 발생할 수 있으며, 이는 데이터 무결성을 해치고 버그를 초래할 수 있습니다. 예를 들어, 중요한 데이터가 외부에서 수정될 수 있다면, 시스템 안정성에 심각한 위험이 될 수 있습니다.
2. 핵심 개념 설명
접근 제어자는 클래스의 멤버(변수, 메서드 등)에 대한 접근 수준을 정의하는 키워드입니다. 자바에는 네 가지 접근 제어자가 있습니다.
| 접근 제어자 | 설명 |
|---|---|
| public | 모든 클래스에서 접근 가능 |
| protected | 같은 패키지 및 서브클래스에서 접근 가능 |
| default | 같은 패키지에서만 접근 가능 |
| private | 같은 클래스 내에서만 접근 가능 |
예를 들어, public은 마치 열려있는 문과 같아 누구나 들어올 수 있는 반면, private는 잠긴 문처럼 오직 소유자만이 열 수 있는 것입니다.
3. 기본 코드 예제
아래는 각 접근 제어자의 기본 사용법을 보여주는 코드입니다.
class AccessControl {
public int publicField = 1; // 모든 클래스에서 접근 가능
protected int protectedField = 2; // 같은 패키지 및 서브클래스에서 접근 가능
int defaultField = 3; // 같은 패키지에서만 접근 가능
private int privateField = 4; // 같은 클래스에서만 접근 가능
public void displayFields() {
System.out.println("Public: " + publicField);
System.out.println("Protected: " + protectedField);
System.out.println("Default: " + defaultField);
System.out.println("Private: " + privateField);
}
}
public class TestAccess {
public static void main(String[] args) {
AccessControl ac = new AccessControl();
ac.displayFields(); // 모든 필드를 출력
}
}
실행 결과:
Public: 1
Protected: 2
Default: 3
Private: 4
AccessControl클래스에서 여러 필드를 정의하고 있습니다.publicField는 모든 클래스에서 접근 가능하므로 자유롭게 사용할 수 있습니다.protectedField는 같은 패키지에 있는 클래스나 서브클래스에서 접근할 수 있습니다.defaultField는 같은 패키지 내에서만 접근할 수 있습니다.privateField는 오직AccessControl클래스 내부에서만 접근 가능하므로, 외부에서는 사용할 수 없습니다.displayFields()메서드는 모든 필드를 출력합니다.
4. 실전 활용 예제
예제 1: 쇼핑몰의 장바구니 클래스
class ShoppingCart {
private List<String> items = new ArrayList<>();
public void addItem(String item) {
items.add(item);
}
public void displayItems() {
System.out.println("장바구니에 있는 아이템: " + items);
}
}
상황 설명: 장바구니에 아이템을 추가하고, 내부 리스트는 외부에서 접근할 수 없도록 private로 설정했습니다. 이렇게 하면 사용자가 장바구니의 아이템을 직접 수정하는 것을 방지할 수 있습니다.
예제 2: 은행 계좌 클래스
class BankAccount {
private double balance;
public BankAccount(double initialBalance) {
this.balance = initialBalance;
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public double getBalance() {
return balance;
}
}
상황 설명: 은행 계좌의 잔액을 private으로 설정하여 외부에서 직접 접근할 수 없도록 하고, deposit() 메서드를 통해서만 잔액을 수정할 수 있게 합니다.
5. 흔한 실수와 주의사항
- 접근 제어자를 잘못 설정하기
- default 접근 제어자를 이해하지 못하기
- protected의 사용에 대한 혼동
- 접근 제어자는 클래스 멤버의 접근 수준을 제어하여 데이터 무결성을 유지하는 데 도움을 줍니다.
public,protected,default,private의 개념을 이해하고 적절히 사용하는 것이 중요합니다.- 실무에서 자주 사용하는 패턴으로는 장바구니 클래스, 은행 계좌 클래스 등이 있습니다.
- 다음에 학습하면 좋은 주제는 상속과 다형성입니다. 접근 제어자와 함께 다루면 더 깊이 있는 이해가 가능합니다.
- 잘못된 코드:
class Example {
private int value;
}
Example ex = new Example(); // value에 접근 불가
- 올바른 코드:
class Example {
private int value;
public int getValue() {
return value; // 접근 가능한 메서드 제공
}
}
- 같은 패키지에서만 접근 가능하므로, 서로 다른 패키지에서는 사용할 수 없습니다. 이를 모르고 사용할 경우 에러가 발생합니다.
- protected는 같은 패키지의 클래스에서도 접근 가능하다는 점을 명심해야 합니다.