[Java] 10. 캡슐화란?
캡슐화란?
객체의 속성(데이터)과 메서드(동작)를 하나로 묶고, 외부에서 직접 접근하지 못하도록 감추는 것을 말합니다. 즉, 데이터를 보호하고, 의도하지 않은 결과가 일어나지 않게, 통제 가능한 방식으로만 다루게 하는 것입니다.
예를 들어 은행 계좌를 생각해보겠습니다.
우리는 계좌에 대한 입금, 출금, 잔액 조회는 반드시 은행 창구나 앱을 통해서만 할 수 있습니다. 이 창구나 앱이 바로 공개된 메서드(public method)이고, 잔액(balance) 같은 정보는 외부에서 직접 접근할 수 없는 숨겨진(private) 정보입니다.
우리가 잔액을 직접 변경 할 수는 없습니다. 만약 직접 접근이 가능하게되면 잔액을 우리의 임의대로 변경이 가능하니, 위험한 상황 또는 의도치 않은 일이 발생할 수 있습니다. 따라서 우리는 아래의 메서드를 통해서만 계좌 잔액을 변경, 조회를 할 수 있습니다.
- 입금 : 잔액을 추가하는 메서드
- 출금 : 잔액을 차감하는 메서드
- 조회 : 잔액을 조회하는 메서드
정리하면
계좌 잔액(balance)은 외부에서 직접 바꿀 수 없어야 합니다. 입금이나 출금 기능을 통해서만 조작할 수 있어야, 계좌의 신뢰성과 정확성이 유지됩니다. 바로 이것이 캡슐화의 핵심입니다. 즉, 데이터는 숨기고, 허용된 방법으로만 다룰 수 있게 만든다는 것입니다.
실습 예제
다음은 은행 계좌 입금, 출금, 조회 예제를 통해 직접 캡슐화를 구현해보겠습니다.
- 실습 예제 -
* BankAccount 클래스
public class BankAccount {
private int account; // 외부에서 직접 접근 불가
/* 입금 */
public void deposit(int amount) {
if (amount > 0) account += amount;
}
/* 출금 */
public void withdraw(int amount) {
if (amount > 0 && account >= amount) account -= amount;
}
/* 잔액 조회 */
public int getAccount() {
return account;
}
}
* BankCounter 클래스
public class BankCounter {
public static void main(String[] args) {
BankAccount bankAccount = new BankAccount();
// 1000원 입금
bankAccount.deposit(1000);
// 300원 출금
bankAccount.withdraw(300);
// 계좌 잔액 조회
System.out.println("계좌 잔액 : " + bankAccount.getAccount());
//bankAccount.account = -99999; // 에러! 잔액에 직접 접근 불가
}
}
- 출력 결과 -
계좌 잔액 : 700
위 코드를 살펴보면, BankAccount 클래스의 입금과 출금 메서드는 검증 로직을 통해 계좌 잔액을 안전하게 보호하고 있습니다.
- 입금 메서드는 입력된 금액이 항상 양의 정수인지 확인하여, 잘못된 값이 잔액에 반영되지 않도록 합니다.
- 출금 메서드는 금액이 양의 정수이며, 현재 잔액보다 크지 않은 경우에만 출금이 가능하도록 제어합니다.
이처럼 두 가지 조건을 검증함으로써, 계좌의 잔액이 비정상적인 상태로 바뀌는 것을 방지하고 있습니다.
캡슐화를 하는 이유
1. 의도되지 않은 동작 방지
- 잘못된 값(예: 나이 음수)을 외부에서 마음대로 넣을 수 없도록 막습니다.
- 원래 의도한 기능이나 동작을 제대로 수행하지 못하게 되는 상황 방지합니다.
2. 유효성 검증 가능
- 메서드 안에서 입력값을 검증하여 정상적인 값만 반영하게 할 수 있습니다.
3. 내부 구현 숨김 (정보 은닉)
- 내부 구조를 바꾸더라도 외부에는 영향을 주지 않아 유지보수가 쉬워집니다.
4. 객체지향 원칙 준수
- 속성과 기능을 하나로 묶고 외부 접근을 통제하는 것이 바로 객체지향의 핵심입니다.
5. 디버깅 및 테스트 용이
- 모든 값 변경이 메서드를 통해 이루어지므로, 추적·로깅·에러 방지가 쉬워집니다.
요약하면
캡슐화는 객체를 보호하고, 의도하지 않은 접근이나 조작을 막아주는 안전장치입니다.
클래스 생성 팁
속성(변수)은 private로 감추기
속성(변수) 접근은 public 메서드(getter/setter)로 제한
이것만 지켜도 보다 안전하고 유지보수하기 쉬운 코드를 작성할 수 있습니다!
읽어주셔서 감사합니다 😊