
캡슐화란 무엇일까요?
- 캡슐화는 물건을 상자에 잘 넣어두는 것과 비슷해요.
- 상자(클래스) 안에는 값(속성)이 있고, 상자 밖에서는 마음대로 꺼내거나 바꿀 수 없어요. 대신 상자에 구멍(메서드)을 만들어서 안전하게 넣고 빼요.
- 이렇게 하면 상자 안의 소중한 값이 망가지지 않도록 지킬 수 있어요.
예시 비유:
- 친구의 일기(데이터)를 아무나 볼 수 없게 자물쇠(비공개)가 붙어 있고, 일기 주인이 허락할 때만 읽게 해주는 것과 같아요.
캡슐화 의 의미는 "민감한" 데이터를 사용자에게서 숨기는 것입니다. 이를 위해서는 다음이 필요합니다.
- 클래스 변수/속성을 다음과 같이 선언합니다.private
- 변수 값에 접근하고 업데이트하기 위한 공개 get 및 set 메서드를 제공합니다.private
캡슐화가 필요한 이유는?
- 클래스 속성 및 메서드에 대한 더 나은 제어
- 클래스 속성은 읽기 전용 (메서드만 사용하는 경우 get) 또는 쓰기 전용 (메서드만 사용하는 경우 set) 으로 만들 수 있습니다.
- 유연성: 프로그래머는 다른 부분에 영향을 주지 않고 코드의 한 부분을 변경할 수 있습니다.
- 데이터 보안 강화
핵심 요약
- 중요한 데이터는 숨기고(private) 안전하게 꺼내고 바꾸는 방법(getter, setter)만 공개합니다.
- 아래 예제에서는 자동차 이름(carName)을 private으로 숨기고, getCarName()과 setCarName()으로 접근합니다.
Car.java (자동차 클래스 — 데이터는 숨김)
java
public class Car {
// 자동차 이름은 외부에서 바로 바꾸지 못하게 숨김
private String carName;
// 생성자: 자동차를 만들 때 이름을 정함
public Car(String name) {
if (name == null || name.trim().isEmpty()) {
this.carName = "무명차"; // 기본값
} else {
this.carName = name;
}
}
// getter: 자동차 이름을 안전하게 알려줌
public String getCarName() {
return carName;
}
// setter: 자동차 이름을 바꿀 때 검사를 거쳐 바꿈
public void setCarName(String newName) {
if (newName != null && !newName.trim().isEmpty()) {
this.carName = newName;
}
// 잘못된 입력이면 무시(혹은 예외를 던질 수도 있음)
}
}
Main.java (사용 예 — 겟터/세터로 자동차 이름을 읽고 바꿈)
java
public class Main {
public static void main(String[] args) {
Car myCar = new Car("빠른이"); // 초기 이름 설정
System.out.println("현재 자동차 이름: " + myCar.getCarName()); // 빠른이
// 이름 바꾸기 (정상 입력)
myCar.setCarName("번개호");
System.out.println("이름 변경 후: " + myCar.getCarName()); // 번개호
// 잘못된 입력(빈 문자열)은 무시됨
myCar.setCarName(" ");
System.out.println("잘못된 입력 시: " + myCar.getCarName()); // 여전히 번개호
// null 입력도 무시되어 안전함
myCar.setCarName(null);
System.out.println("null 입력 시: " + myCar.getCarName()); // 여전히 번개호
}
}
추가 설명
- 자동차 이름을 바로 바꾸지 못하게 숨겨놓으면 안전해요. 마치 장난감 박스에 자물쇠를 채워두고 주인만 열 수 있게 하는 것과 같아요.
- 이름을 바꿀 때는 꼭 제대로 된 이름인지 검사한 다음 바꿔요(빈문자나 null이면 바꾸지 않음). 이게 캡슐화의 장점이에요.
실행 결과 (콘솔 출력 예시)
현재 자동차 이름: 빠른이
이름 변경 후: 번개호
빈 문자열 입력 시: 번개호
null 입력 시: 번개호
너무 긴 이름 입력 시: 번개호
최종 자동차 이름: 번개소년
설명(간단히)
- carName은 외부에서 직접 접근하지 못하도록 private으로 숨겼습니다.
- getCarName()으로 안전하게 읽고, setCarName(...)으로만 바꿀 수 있게 했습니다.
- set 메서드에서 빈값, null, 너무 긴 이름 같은 잘못된 입력을 걸러 내부 데이터가 엉키지 않도록 했습니다.
'Java_language' 카테고리의 다른 글
| 자바의 import (0) | 2025.12.01 |
|---|---|
| 클래스 변수 vs 인스턴스 (0) | 2025.12.01 |
| 자바의 static과 this에 대해서 (0) | 2025.12.01 |
| 자바 접근제어자(Access Modifier) (0) | 2025.12.01 |
| BankAccount 클래스 (0) | 2025.11.27 |