# 캡슐화 1. 캡슐화는 객체지향프로그래밍의 핵심 개념 중 하나 2. 객체 상태가 외부로부터 숨겨진 상황에서 이 상태에 접근하는 일련의 공개(public) method만 노출하는 기법 3. 각 객체가 클래스 내에서 객체의 상태를 비공개(private)로 유지할 때 성립 4. 캡슐화는 정보 은닉(information-hiding) 메커니즘이라고도 함 5. 느슨한 결합(loosely coupied), 재사용성, 보안 및 테스트하기 쉬운 코드와 같은 여러 이점 제공 6. 캡슐화는 접근 제어자(public, private, protected)로 구현할 수 있음. **[MY Answer]** 캡슐화는 객체지향프로그래밍의 핵심 개념 중 하나입니다. 객체 상태가 외부로부터 숨겨진 상황에서 이 상태에 접근하는 public method만 노출하는 기법으로 느슨한 결합, 재사용성, 보안 및 테스트 하기 쉬운 코드와 같은 여러 이점을 제공합니다. 비유를 들자면 집안에 있는 사람을 불러 낼때 초인종을 눌러서 호출하는 상황에서 초인종과 같은 기능을 한다고 볼 수 있습니다. 이러한 캡슐화는 정보 은닉 매커니즘이라고도 하며, 각 객체가 클래스 내에서 객체의 상태를 private로 유지할 때 성립합니다. 캡슐화는 접근 제어자(public, private, protected)로 구현할 수 있습니다. <details><summary>채점결과</summary> 당신의 답변은 매우 잘 작성되어 있습니다. 캡슐화의 개념, 이점, 그리고 이를 구현하는 방법에 대해 명확하게 설명하였습니다. 또한, 초인종을 눌러서 집안의 사람을 호출하는 비유는 캡슐화를 이해하기 쉽게 만들어줍니다. 하지만 추가적으로 언급할 수 있는 부분이 있습니다. 캡슐화는 객체의 상태를 변경하거나 조회하는 메서드(getter/setter)를 제공함으로써 외부에서 직접 접근할 수 없는 private 멤버 변수에 대한 안전한 접근을 가능하게 합니다. 따라서 나는 당신의 답변에 9점을 주겠습니다. 이미 매우 잘 작성되었지만, getter와 setter 메서드에 대한 언급이 추가되면 완벽할 것 같습니다. </details> **[BOOK Answer]** **캡슐화는 객체지향 프로그래밍의 핵심 개념 중 하나**입니다. 캡슐화는 주로 코드와 데이터를 하나의 작업 단위인 클래스로 결합하고 외부 코드가 이 데이터에 직접 접근하지 못하게 하는 방어막 역할을 합니다. 또한 **객체 상태를 외부로부터 숨기고 이 상태에 접근하기 위한 일련의 public ㅔㅁ서드를 노출하는 기법**입니다. **각 객체가 클래스 안에서 상태를 private로 유지할 때 캡슐화가 성립**되었다고 말할 수 있습니다. 따라서 **캡술화는 정보은닉 매커니즘**이라고 불리기도 합니다. **캡슐화를 이용하는 코드는 몇 가지 장점이 있습니다. 먼저 코드의 느슨한 결합이 가능합니다.** 예를 들어 클라이언트 코드와 어긋나지 않는 상태에서 클래스 변수의 이름을 변경할 수 있습니다. **또한 재사용할 수 있으며** 클래스 내에서 데이터가 어떻게 조작되는지 클라이언트가 인식하지 못하므로 안전합니다. 마지막으로 필드를 테스트하는 것보다 메서드를 테스트하는 편이 더 쉽기 때문에 캡슐화를 이용한 코드는 **테스트하기 쉽다는 장점**이 있습니다. **자바에서 캡슐화는 public, private, protected와 같은 접근 제어자로 구현**할 수 있습니다. 일반적으로 객체가 자체 상태를 관리할 때 상태는 private 변수로 선언되고 public 메서드로 접근 및 수정됩니다. 예를 들자면 Cat 클래스는 meow와 같이 클래스 외부에서 접근할 수 없는 private method도 가질 수 있습니다. 이것이 캡슐화입니다. ```java public class Cat{ private int mood = 50; private int hungry = 50; private int energy = 50; public void sleep(){ System.out.println("Sleep...."); energy++; hungry++; } public void play(){ System.out.println("Play...."); mood++; energy--; meow(); } public void feed(){ System.out.println("feed...."); hungry--; mood++; meow(); } public void meow(){ System.out.println("Meow!!!"); } public int getMood(){ return mood; } public int getHungry(){ return hungry; } public int getEnergy(){ return energy; } } ``` 이 클래스의 상태는 private 필드로 캡슐화되므로 클래스 외부에서 직접 접근할 수 없습니다. 상태는 public method인 play, feed, sleep으로만 수정할 수 있습니다. ```java public static void main(String[] args){ Cat cat = new Cat(); cat.feed(); cat.play(); cat.feed(); cat.sleep(); System.out.println("Energy:"+ cat.getEnergy()); System.out.println("Mood:"+cat.getMood()); System.out.println("Hungry:"+cat.getHungry()); } ``` **[GPT Answer]** 캡슐화는 일상 생활에서도 흔히 볼 수 있는 개념입니다. 비유를 사용해서 설명해보겠습니다. 우리가 약을 복용할 때, 알약의 코팅이나 캡슐은 약의 활성 성분을 보호하고, 우리 몸 안에서 필요한 위치에 정확하게 전달하는 역할을 합니다. 이때 우리는 알약의 내부 성분이 무엇인지, 어떻게 작동하는지 상세하게 알 필요 없이, 그저 캡슐을 목에 넘기면 됩니다. 이것이 바로 캡슐화입니다. Java 코드 예시로 들어보면: ```java public class BankAccount { private double balance; public void deposit(double amount) { if(amount > 0) { balance += amount; } } public void withdraw(double amount) { if(amount > 0 && balance >= amount) { balance -= amount; } } public double getBalance() { return balance; } } ``` 위 코드에서 `BankAccount` 클래스는 `balance`라는 private 변수를 가지고 있습니다. 이 변수는 외부에서 직접 접근할 수 없으며 오직 클래스 내부 메소드(`deposit`, `withdraw`, `getBalance`)를 통해서만 접근 및 변경이 가능합니다. 따라서 사용자는 계좌 잔액(`balance`)의 구현 세부 사항을 몰라도 되며, 제공된 메소드들만 사용하여 입금(deposit), 출금(withdraw), 잔액 확인(getBalance) 등의 작업을 수행할 수 있습니다. 즉, 이렇게 객체 내부 데이터와 구현 방식을 숨기고 외부에 공개된 메소드를 통해서만 상태 변화가 가능하도록 하는 것이 바로 캡슐화입니다.