Java 캡슐화(Encapsulation) 완벽 이해하기
객체지향 프로그래밍(OOP)을 설명할 때 가장 먼저 등장하는 핵심 개념 중 하나가 바로:
캡슐화(Encapsulation)
입니다.
초보 시절에는 보통:
private 사용하기
getter/setter 만들기
정도로만 이해하고 넘어가는 경우가 많습니다.
하지만 실제 캡슐화는 단순 문법이 아니라:
- 객체 내부 상태 보호
- 잘못된 데이터 변경 방지
- 유지보수성 향상
- 객체 책임 분리
- 안정적인 시스템 설계
와 깊게 연결되는 매우 중요한 설계 개념입니다.
실무에서도 캡슐화가 무너지면:
- 객체 상태가 여기저기서 변경되고
- 사이드 이펙트가 증가하며
- 디버깅이 어려워지고
- 유지보수가 매우 힘들어집니다.
이번 글에서는:
- 캡슐화란 무엇인가
- 왜 필요한가
- private만 쓰면 캡슐화인가
- getter/setter 남용 문제
- 실무에서 좋은 캡슐화란 무엇인가
까지 정리해보겠습니다.
1. 캡슐화(Encapsulation)란?
Object-Oriented Programming 에서 캡슐화란:
객체 내부 상태와 구현을 외부로부터 보호하고 필요한 기능만 공개하는 것
입니다.
즉:
데이터 보호
+
행동을 통한 접근
이 핵심입니다.
2. 왜 캡슐화가 필요할까?
예를 들어 은행 계좌를 생각해보겠습니다.
잘못된 설계:
public class Account {
public int balance;
}
이 경우:
account.balance = -100000;
같은 잘못된 변경 가능.
즉 객체 상태가 보호되지 않습니다.
3. 캡슐화 적용 예시
public class Account {
private int balance;
public void deposit(int amount) {
balance += amount;
}
public void withdraw(int amount) {
if (balance < amount) {
throw new IllegalArgumentException();
}
balance -= amount;
}
public int getBalance() {
return balance;
}
}
장점:
- 음수 잔액 방지
- 상태 변경 통제 가능
- 비즈니스 규칙 유지 가능
4. 캡슐화의 핵심은 “행동 중심”
많은 초보자가:
private + getter/setter
만 사용하면 캡슐화라고 생각합니다.
하지만 진짜 핵심은:
객체가 자신의 상태를 스스로 관리하는 것
입니다.
5. 안 좋은 setter 남용
user.setAge(-100);
문제:
- 객체 상태 무결성 깨짐
- 어디서든 수정 가능
- 객체 책임 사라짐
6. 좋은 객체 설계 방식
setter 대신:
changePassword()
increaseBalance()
completeOrder()
처럼:
의미 있는 행동(Method)
을 제공하는 것이 좋습니다.
7. Getter도 무조건 좋은 것은 아니다
예시:
if (user.getBalance() > 1000)
외부 객체가 내부 상태를 기반으로 직접 판단 시작.
즉:
객체 책임이 외부로 새어나감
문제 발생 가능.
8. Tell, Don't Ask 원칙
객체지향에서 중요한 원칙:
묻지 말고 시켜라(Tell, Don't Ask)
안 좋은 예:
if (user.getStatus() == ACTIVE)
좋은 예:
user.activate();
객체 스스로 처리하도록 설계.
9. 캡슐화와 정보 은닉(Information Hiding)
캡슐화는:
내부 구현 숨김
과 연결됩니다.
예시:
public void pay()
사용자는:
- 내부 DB 처리
- API 호출
- 로그 저장
등을 몰라도 사용 가능.
10. 캡슐화와 유지보수
내부 구현이 바뀌어도:
public API 유지
되면 외부 영향 최소화 가능.
예시:
ArrayList -> LinkedList 변경
해도 외부 영향 적음.
11. 접근 제어자와 캡슐화
Java는 접근 제어자를 통해 캡슐화를 지원합니다.
| private | 클래스 내부만 |
| default | 같은 package |
| protected | 상속 포함 |
| public | 전체 공개 |
12. private가 중요한 이유
private String password;
직접 접근 차단.
즉:
- 무분별한 변경 방지
- 객체 무결성 유지
가능.
13. 캡슐화와 불변 객체(Immutable)
캡슐화를 극단적으로 강화한 구조가:
Immutable Object
입니다.
예시:
public class User {
private final String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
특징:
- 생성 후 변경 불가
- Thread-safe
- 안정성 높음
14. 캡슐화와 객체 책임
좋은 객체는:
- 자신의 데이터는 자신이 관리
- 외부에서 직접 조작 불가
특징을 가집니다.
15. 캡슐화가 무너지면 생기는 문제
예시:
order.status = COMPLETE;
문제:
- 검증 로직 우회 가능
- 비즈니스 규칙 깨짐
- 객체 상태 꼬임
16. 좋은 설계 방식
order.complete();
내부에서:
- 상태 검증
- 이벤트 처리
- 로그 저장
함께 수행 가능.
17. 캡슐화와 Layered Architecture
실무에서는:
Controller
↓
Service
↓
Domain
구조에서:
- Domain 객체가 자신의 상태를 관리
하도록 설계하는 것이 중요합니다.
18. Getter/Setter 자동 생성의 함정
IDE가 쉽게 생성해주다 보니:
모든 필드 public처럼 사용
되는 경우 많음.
이것은:
객체지향이 아니라 데이터 구조체에 가까움
상태가 됩니다.
19. 캡슐화와 응집도
좋은 객체는:
관련 있는 데이터와 기능이 함께 존재
합니다.
예시:
잔액 데이터
+
입금/출금 기능
같은 객체 내부 존재.
20. 캡슐화와 결합도
캡슐화가 잘 되면:
- 외부 의존 감소
- 내부 구현 변경 자유
- 유지보수 용이
장점이 있습니다.
21. 실무에서 자주 하는 실수
1) 모든 필드 setter 공개
객체 무결성 깨짐.
2) DTO와 Domain 객체 구분 없음
모든 객체가 단순 데이터 전달 역할만 수행.
3) 객체 책임 외부 분산
Service가 객체 내부 상태까지 직접 관리.
22. 실무에서 좋은 캡슐화 예시
좋은 구조:
order.cancel();
안에서:
- 상태 변경
- 검증
- 이벤트 발행
처리.
외부는 내부 구현 몰라도 됨.
23. 캡슐화의 진짜 목적
캡슐화의 핵심 목적은:
객체 상태 보호
+
변경 영향 최소화
입니다.
즉:
- 유지보수 쉬운 코드
- 안정적인 객체
- 버그 감소
를 위한 핵심 설계 원칙입니다.
24. 정리
캡슐화(Encapsulation)는 단순히:
private 사용하는 기술
이 아닙니다.
실제로는:
- 객체 상태 보호
- 비즈니스 규칙 유지
- 책임 분리
- 유지보수성 향상
- 안정적인 설계
를 위한 핵심 객체지향 원칙입니다.
특히 실무에서는:
- setter 남용 방지
- 의미 있는 행동 제공
- immutable 설계
- 객체 책임 관리
가 매우 중요합니다.
다음 글에서는:
상속(Inheritance)
를 코드 재사용과 객체 설계 관점까지 포함해서 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java 다형성(Polymorphism) 완벽 이해하기 (0) | 2026.05.22 |
|---|---|
| Java 상속(Inheritance) 완벽 이해하기 (0) | 2026.05.22 |
| 객체지향 프로그래밍(OOP) 완벽 이해하기 (0) | 2025.04.19 |
| Java package와 import 구조 완벽 이해하기 (1) | 2025.04.16 |
| Java final 키워드 완벽 이해하기 (1) | 2025.04.15 |
댓글