JAVA (10) - 캡슐화와 접근 제어자
JAVA (10) - 캡슐화와 접근 제어자
1. 개요
객체지향 프로그래밍(OOP)의 핵심 특징 중 하나는 캡슐화(Encapsulation)다. 캡슐화는 연관된 데이터와 메서드를 하나의 단위로 묶고, 외부로부터 데이터를 보호하는 기법을 의미한다.
Java에서는 이러한 캡슐화를 구현하고 객체의 내부 데이터에 대한 접근 범위를 지정하기 위해 접근 제어자(Access Modifier)를 제공한다.
2. 캡슐화(Encapsulation)란?
캡슐화는 알약 캡슐 안에 여러 성분을 넣어 내부를 보호하고 외부에는 알약 자체만 노출하는 것과 유사하다. 객체지향에서 캡슐화가 제공하는 주요 이점은 두 가지다.
- 데이터 보호 (Data Hiding): 외부에서 객체의 중요한 필드 값을 직접 변경하지 못하도록 막는다.
- 자율성 확보 (정보 은닉): 내부 구현 로직을 외부에 숨기고, 필요한 인터페이스(메서드)만 외부에 제공하여 모듈 간의 독립성을 높인다.
만약 데이터 보호가 이루어지지 않는다면 외부에서 잘못된 데이터를 주입하여 객체의 상태가 오염될 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
// 캡슐화가 적용되지 않은 예시
class BankAccount {
public int balance; // 외부에서 직접 접근 가능
}
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount();
account.balance = -10000; // 음수 잔액이라는 치명적인 오류 발생 가능
}
}
3. 접근 제어자(Access Modifier)의 종류와 범위
Java는 클래스, 필드, 메서드, 생성자의 접근 범위를 지정하기 위해 4가지 접근 제어자를 제공한다.
- private: 같은 클래스 내에서만 접근 가능 (가장 제한적)
- (default): 접근 제어자를 명시하지 않은 경우. 같은 패키지 내에서만 접근 가능
- protected: 같은 패키지 내, 또는 다른 패키지의 자식 클래스에서 접근 가능
- public: 접근 제한이 전혀 없음 (가장 넓은 범위)
접근 범위 요약
| 접근 제어자 | 같은 클래스 | 같은 패키지 | 자식 클래스 (다른 패키지) | 전체 (다른 패키지) |
|---|---|---|---|---|
| private | O | X | X | X |
| (default) | O | O | X | X |
| protected | O | O | O | X |
| public | O | O | O | O |
4. Getter와 Setter를 통한 안전한 데이터 접근
캡슐화를 적용할 때는 멤버 변수를 private으로 선언하여 외부 직접 접근을 차단하고, Getter와 Setter 메서드를 통해 간접적으로 접근하도록 설계한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class BankAccount {
// 1. 멤버 변수를 private으로 보호
private int balance;
// 2. Setter를 통해 유효성 검증 후 데이터 수정
public void deposit(int amount) {
if (amount <= 0) {
System.out.println("입금 금액은 0원보다 커야 합니다.");
return;
}
this.balance += amount;
}
// 3. Getter를 통해 데이터 조회
public int getBalance() {
return this.balance;
}
}
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount();
account.deposit(-5000); // 유효성 검증 실패: "입금 금액은 0원보다 커야 합니다."
account.deposit(10000);
System.out.println("현재 잔액: " + account.getBalance()); // 10000
}
}
이처럼 Setter 내부에서 조건문 등을 통해 유효하지 않은 값이 입력되는 것을 사전 방지함으로써 객체 데이터의 무결성을 지킬 수 있다.
5. 정리
- 캡슐화는 객체의 내부 필드와 메서드를 하나로 묶고, 불필요한 구현을 외부에 노출하지 않도록 보호하는 개념이다.
- Java에서는 접근 제어자(
private,default,protected,public)를 사용하여 클래스 요소의 접근 권한을 명확히 제어한다. - 데이터를 안전하게 다루기 위해 필드는
private으로 설정하고, 필요한 경우 Getter/Setter 메서드를 제공하는 것이 올바른 객체지향 설계의 기본이다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.