2026년 3월 31일
객체지향 프로그래밍(OOP)에서 캡슐화(encapsulation)는 단순히 데이터를 하나로 묶는 것 이상의 의미를 가집니다. 핵심은 "필드(데이터)와 행위(메서드)를 하나로 묶고, 외부에서 직접적인 접근을 제한하여 객체의 내부 구현을 감추는 것"입니다.
오늘은 캡슐화를 구현하는 구체적인 방법인 접근 제어자의 사용법과, 직접 변수에 접근하는 방법 대신 Getter/Setter를 사용하는지 정리해 보겠습니다.
접근 제어자는 클래스, 필드, 메서드의 공개 범위를 결정합니다. 외부에서 마음대로 데이터를 수정하지 못하게 막는 '성벽' 역할을 하죠.
| 제어자 | 설명 | 접근 범위 |
|---|---|---|
| private | 클래스 내부에서만 접근 가능. 가장 엄격한 보안 수준. | 클래스 내부 |
| protected | 동일 패키지 내 클래스 또는 해당 클래스를 상속받은 자식 클래스에서 접근 가능. | 패키지 + 자식 클래스 |
| public | 어디서든 접근 가능. 클래스의 외부 인터페이스를 정의할 때 사용. | 전체 |
언어에 따라 default(패키지 내부) 등의 추가 제어자가 있을 수 있습니다. 백엔드 세션에서 다루는 JAVA에서는 default 접근제어자를 제공하고 있습니다.
"어차피 public으로 선언해서 직접 바꾸나, Setter를 통해 바꾸나 결과는 같은 것 아닌가요?"라는 의문이 생길 수 있습니다. 하지만 Getter와 Setter를 사용하는 데에는 명확한 이유가 있습니다.
변수에 직접 접근하면 잘못된 값이 들어오는 것을 막을 방법이 없습니다. Setter를 사용하면 조건문을 통해 데이터의 무결성을 지킬 수 있습니다.
// 직접 접근 시 (위험)
user.age = -10; // 나이가 음수가 되는 논리적 오류 발생
// Setter 사용 시 (안전)
public void setAge(int age) {
if (age >= 0) {
this.age = age;
} else {
System.out.println("유효하지 않은 나이입니다.");
}
}객체 내부의 데이터 구조가 변경되어도 외부 코드를 수정할 필요가 없습니다. 예를 들어, name이라는 필드를 firstName과 lastName으로 나누더라도, getName() 메서드 내부 로직만 수정하면 외부에서는 여전히 getName()을 호출해 이름을 가져올 수 있습니다.
Getter만 제공하면 외부에서 값을 수정할 수 없는 읽기 전용(Read-only) 변수를 만들 수 있습니다.
개념으로만 듣고 넘어가기에는 아쉬우니, 예시를 같이 보도록 합시다. 아래는 계좌 정보를 관리하는 간단한 클래스입니다. 잔액(balance)은 매우 민감한 정보이므로 직접 수정할 수 없도록 하고, 메서드를 통해서만 제어하도록 설계했습니다.
public class BankAccount {
// 1. private으로 외부 접근 차단 (정보 은닉)
private double balance;
public BankAccount(double initialBalance) {
if (initialBalance >= 0) {
this.balance = initialBalance;
}
}
// 2. Getter: 안전하게 값을 조회
public double getBalance() {
return balance;
}
// 3. Setter 대신 비즈니스 로직을 담은 메서드 제공
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println(amount + "원이 입금되었습니다.");
}
}
}캡슐화는 단순히 코드를 깔끔하게 만드는 것이 아니라, 객체의 독립성과 안전성을 확보하는 과정입니다. 아래 두 가지 내용이 캡슐화의 핵심이라고 할 수 있죠.
접근 제어자를 통해 최소한의 정보만 외부에 노출하기
Getter/Setter를 활용해 데이터의 유효성을 검사하고 유지보수성을 높이기
제대로 된 캡슐화는 협업 시 동료 개발자가 내 코드를 잘못 사용하여 발생할 수 있는 오류를 사전에 방지하는 좋은 방법입니다. 앞으로 저희 모두 클래스를 설계할 때에는 꼭 캡슐화 원칙을 먼저 떠올리는 아기사자가 되도록 합시다!
댓글 0