반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- 인텔리제이
- math
- js
- json
- 자바스크립트
- junit5
- 자바
- java테스트
- vscode
- IntelliJ
- CSS
- Eclipse
- 문자열
- HashMap
- junit
- 테스트자동화
- ArrayList
- string
- 배열
- 자바문법
- 정규식
- 이클립스
- list
- input
- javascript
- html
- 단위테스트
- Visual Studio Code
- Java
- Array
Archives
- Today
- Total
어제 오늘 내일
[Java] 캡슐화(Encapsulation)란? 본문
Java의 캡슐화(Encapsulation)는 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로,
객체의 데이터(필드)를 외부에서 직접 접근하지 못하도록 숨기고, 필요한 경우 메서드를 통해서만 접근하도록 만드는 것을 의미합니다.
이를 통해 데이터 보호, 잘못된 접근 방지, 유지보수성 향상 등의 효과를 얻을 수 있습니다.
1. 캡슐화의 핵심 개념
캡슐화는 크게 두 가지 원칙으로 구성됩니다.
- 필드(변수)를 private으로 감추기 (정보 은닉)
- getter/setter 같은 공개된 메서드를 통해 접근하도록 제한하기
예:
private int age; // 외부에서 직접 접근 불가
public int getAge() { // 메서드를 통해서만 접근
return age;
}
public void setAge(int age) {
this.age = age;
}
이렇게 하면 데이터를 언제든지 보호하거나 유효성 검사 로직을 추가할 수 있습니다.
2. 왜 캡슐화가 필요할까?
✔ 잘못된 데이터 변경 방지
직접 필드를 수정하는 것을 막고, setter에서 유효성 검사를 적용할 수 있습니다.
✔ 내부 구조 숨기기
객체 내부의 동작 방식이 외부에 노출되지 않아 코드가 안전해짐.
✔ 유지보수성과 확장성 향상
내부 구현이 바뀌어도 외부 코드는 그대로 사용할 수 있음.
✔ 객체 일관성 유지
값 변경 시 조건 검사를 수행하여 객체가 올바른 상태를 유지하도록 함.
3. 캡슐화 예제
잘못된 예: 필드를 public으로 사용
class Person {
public int age;
}
문제점
- 외부에서 누구나 마음대로 값을 변경할 수 있음
- 유효성 검사나 보호 로직을 적용할 수 없음
올바른 캡슐화 예
class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0) { // 유효성 검사
System.out.println("나이는 0보다 작을 수 없습니다.");
return;
}
this.age = age;
}
}
사용:
Person p = new Person();
p.setAge(20); // 정상 설정
p.setAge(-5); // 경고 메시지 출력
4. 캡슐화 + 접근 제어자
캡슐화는 접근 제어자와 밀접하게 연관됩니다.
| 제어자 | 의미 | 캡슐화에 사용 여부 |
| private | 클래스 내부에서만 접근 | ✔ 핵심 |
| default | 같은 패키지에서만 접근 | △ |
| protected | 상속 + 같은 패키지 접근 | △ |
| public | 어디서든 접근 가능 | getter/setter에서 사용 |
캡슐화의 핵심은 필드 = private, 메서드 = public 형태의 구조입니다.
5. 캡슐화를 더 쉽게 하는 도구 (Lombok)
Lombok을 사용하면 getter/setter를 자동 생성해 편하게 캡슐화를 적용할 수 있습니다.
@Getter
@Setter
class Person {
private int age;
}
6. 전체 예제
class BankAccount {
private int balance;
public int getBalance() { // 조회
return balance;
}
public void deposit(int amount) { // 입금
if (amount > 0) {
balance += amount;
}
}
public void withdraw(int amount) { // 출금
if (amount > 0 && balance >= amount) {
balance -= amount;
}
}
}
public class Main {
public static void main(String[] args) {
BankAccount acc = new BankAccount();
acc.deposit(1000);
acc.withdraw(300);
System.out.println(acc.getBalance()); // 700
}
}
설명
- balance는 외부에서 직접 조작 불가
- 메서드를 통해서만 안전하게 입·출금 가능
- 객체의 상태를 안정적으로 유지
7. 정리
- 캡슐화 = 데이터 보호 + 접근 제어 + 안전한 메서드 제공
- 필드는 private으로 감추고, 메서드로만 접근하게 함
- 객체의 안정성, 유지보수성, 확장성을 크게 향상시키는 중요한 개념
반응형
'IT > Java' 카테고리의 다른 글
| [Java] 합성(Composition) vs 상속(Inheritance) (0) | 2025.12.28 |
|---|---|
| [Java] 객체지향 4대 원칙 정리 (상속, 추상화, 캡슐화, 다형성) (0) | 2025.12.27 |
| [Java] 다형성(Polymorphism) 이해하기 (0) | 2025.12.26 |
| [Java] this 키워드 사용법 (0) | 2025.12.26 |
| [Java] static 변수와 static 메서드 차이 (0) | 2025.12.25 |
Comments
