캡슐화란, 객체의 필드(변수)를 외부에서 직접 접근하지 못하도록 막고, 메서드를 통해서만 접근할 수 있도록 제한하는 것.
| 이유 | 설명 |
|---|---|
| 🔐 데이터 보호 | 외부에서 직접 필드에 접근하면 잘못된 값이 들어갈 수 있으므로, 이를 막기 위해 |
| 🔁 유지보수 용이 | 내부 로직이 바뀌어도 외부에 영향 없이 메서드만 유지하면 됨 |
| ✅ 유효성 검사 가능 | 값을 설정할 때 조건문으로 검증 가능 |
| 📦 코드 일관성 유지 | 객체 내부의 상태를 일관성 있게 유지할 수 있음 |
필드를 private으로 선언
public getter/setter 메서드로만 접근 허용
public class Student {
private String name;
private int score;
// setter: 값 설정 시 유효성 검사 포함
public void setScore(int score) {
if (score >= 0 && score <= 100) {
this.score = score;
}
}
// getter
public int getScore() {
return this.score;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public class Main {
public static void main(String[] args) {
Student s = new Student();
s.setName("Alice");
s.setScore(-10); // 유효하지 않으므로 무시됨
System.out.println(s.getName() + "의 점수는 " + s.getScore());
}
}
public class Student {
public int score;
}
Student s = new Student();
s.score = -100; // ❌ 유효하지 않은 값도 넣을 수 있음
외부에서 마음대로 필드 값을 변경할 수 있음
잘못된 값으로 인해 프로그램 전체의 상태가 망가질 위험이 큼
객체의 내부 상태를 숨기고, 메서드를 통해 제어한다
데이터 보호 + 유효성 검사 + 유지보수성 향상
자바에서 객체지향의 가장 기본이자 중요한 설계 방식!
캡슐화는 단순히 "필드를 private으로 만들자"가 아니다.
객체가 스스로 데이터를 안전하게 관리할 수 있도록 하는 설계 철학.
복잡한 프로젝트일수록 캡슐화는 코드의 안정성과 유지보수를 좌우할 수 있다.