📚캡슐화란 무엇인지 알아봅시다.

접근제어자 를 통해서 구현할 수 있습니다.📚캡슐화가 필요한 이유를 알아봅시다.
접근제어자 를 이해해야합니다.📚접근제어자가 무엇인 알아봅시다.

| 접근제어자 | 클래스 내부 | 패키지 내부 | 상속한 클래스 | 전체 공개 |
|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| default | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
📚접근제어자 활용 예시를 살펴봅시다.
public class Person { // ✅ 외부에서 접근 불가
public String name; // ✅ 외부에서 접근 불가
private String secret; // ❌ 외부에서 접근 불가
public Person() {} // ✅ 외부에서 접근 불가
public void methodA() {} // ✅ 외부에서 접근 가능
private void methodB() {} // ❌ 외부에서 접근 불가
}
Person person = new Person(); // ✅ 접근가능 생성자가 public
person.name; // ✅ 접근가능 변수가 public
person.secret; // ❌ 접근불가능 변수가 private
person.methodA(); // ✅ 접근가능 메서드가 public
person.methodB(); // ❌ 접근불가능 메서드가 private

💡캡슐화가 된 데이터에 접근 방법
private 으로 보호하고 있습니다.메서드가 바로 게터(Getter)와 세터(Setter) 입니다.💡게터(Getter) 활용법
public class Person {
private String secret;
public String getSecret() {
return this.secret; // ✅ 객체의 secret 속성 반환
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.secret; // ❌ 직접 접근 불가능
String newSecret = p1.getSecret(); // ✅ 게터를 활용해 접근가능
}
}
💡세터(Setter) 활용법
public class Person {
private String secret;
public void setSecret(String secret) {
this.secret = secret; // ✅ secret 속성 설정 및 변경
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.secret = "password"; // ❌ 직접접근, 변경 불가능
p1.setSecret("newPassword"); // ✅ 세터를 활용해 접근, 변경가능
}
}
💡시나리오1: 핵시설을 관리하는 개발자
public class DataStore {
String store;
}
DataStore dataStore = new DataStore();
dataStore.store = "B"; // ❌ 의문의 핵폭발 발생!
store 변수에 문자열 "B" 가 들어오면 핵폭발이 발생하는 위험한 시스템을 다루고 있습니다.1️⃣해결책1: 접근제어자로 데이터 보호
public class DataStore {
private String store;
}
DataStore dataStore = new DataStore();
dataStore.store = "B"; // ❌ 컴파일 오류! 직접 접근 불가!
store 변수에 private 접근제어자를 설정하면 외부에서 직접 변경할 수 없게 되어 핵폭발을 막을 수 있습니다. 하지만 문제가 하나 있습니다!2️⃣해결책2: 세터 추가
public class DataStore {
private String store;
public void setStore(String data) {
this.store = data;
}
}
DataStore dataStore = new DataStore();
dataStore.setStore("B"); // ❌ 다시 핵폭발 발생!
store 변수는 private 이지만 세터를 통해 외부에서 값을 변경할 수 있게 되었습니다.💡무분별한 세터 사용사례
접근을 막아 놓고 다시 세터로 외부에 노출한다면, 접근제어를 하는 의미가 사라집니다.
이런 경우 무조건 세터를 만드는 것이 아니라 올바른 데이터만 저장될 수 있도록 제한해야 합니다.
3️⃣해결책 3: 안전한 데이터 설정 로직을 추가
public class DataStore {
private String store;
public void setStore(String data) {
if ("B".equals(data)) {
System.out.println("❌ 'B'는 입력할 수 없습니다!");
} else {
this.store = data;
}
}
}
"B"가 입력되면 안내메시지를 제공합니다.(핵폭발을 방지합니다.)💡시나리오2: 로보트를 걷게 만들자
public class Robot {
private boolean leftLeg;
private boolean rightLeg;
}
true) 해줘야합니다.1️⃣해결책 1: 세터 추가
public class Robot {
private boolean leftLeg;
private boolean rightLeg;
public void setLeftLeg(boolean power) {
this.leftLeg = power;
}
public void setRightLeg(boolean power) {
this.rightLeg = power;
}
}
Robot robot = new Robot();
robot.setLeftLeg(true); // ✅ 왼쪽 다리 움직임
robot.setRightLeg(true); // ✅ 오른쪽 다리 움직임
setLeftLeg()와 setRightLeg() 메서드를 만들었습니다.public class Robot {
private boolean leftLeg; // 세터필요
private boolean rightLeg;// 세터필요
private boolean leftArm; // 세터필요
private boolean rightArm;// 세터필요
private boolean leftEye; // 세터필요
private boolean rightEye;// 세터필요
}
Robot robot = new Robot();
robot.setLeftLeg(true); // ✅ 왼쪽 다리 움직임
robot.setLeftArm(true); // ⚠️ 왼쪽 팔을 먼저 움직이면 균형이 깨짐
robot.setRightLeg(true); // ✅ 오른쪽 다리 움직임
...
2️⃣해결책 2: 걷기 라는 동작을 직접 제공하기
public class Robot {
private boolean leftLeg;
private boolean rightLeg;
private boolean leftArm;
...
public void walk(boolean power) {
System.out.println("🚶 왼쪽 다리 앞으로!");
leftLeg = power;
System.out.println("🚶 오른쪽 다리 앞으로!");
rightLeg = true;
...
}
}
walks() 안에서 관리됨으로 사용이 간단해졌습니다.💡단순한 세터들을 남용하는 것보다 의미 있는 동작을 제공하는 세터를 만드는 것이 무분별한 세터를 방지할 수 있습니다.