안녕! 오늘의 수업을 캡슐화에 할애하고 예제로 바로 시작하겠습니다. :) 여기 평범한 소다 기계가캡슐화의 원리 - 1 있습니다 . 한 가지 질문이 있습니다. 어떻게 작동합니까? 컵의 출처, 내부 온도는 어떻게 유지되고, 얼음은 어디에 저장되며, 기계는 어떤 시럽을 추가해야 하는지 어떻게 알 수 있습니까? 아마도 이러한 질문에 대한 답이 없을 것입니다. 모든 사람이 그러한 기계를 사용하는 것은 아니므로 충분합니다. 그들은 요즘 그렇게 인기가 없습니다. 다른 예를 들어 보겠습니다. 매일 여러 번 확실히 사용하는 것. 오, 여기 아이디어가 있습니다! Google 검색 엔진이 어떻게캡슐화의 원리 - 2공장. 입력한 단어와 관련된 정보를 정확히 어떻게 검색합니까? 특정 결과의 순위가 높은 이유는 무엇입니까? 매일 Google을 사용하더라도 모르는 경우가 있습니다. 그러나 그것은 중요하지 않습니다. 당신은 이것을 알 필요가 없습니다. 작동 방식에 대해 생각하지 않고 검색 엔진에 쿼리를 입력할 수 있습니다. 어떻게 작동하는지 모른 채 기계에서 탄산음료를 구입할 수 있습니다. 내연 기관이 어떻게 작동하는지, 물리학을 전혀 몰라도 초등학교 수준에서도 자동차를 운전할 수 있습니다. 이 모든 것은 객체 지향 프로그래밍의 주요 원칙 중 하나인 캡슐화 덕분에 가능합니다.. OOP(객체 지향 프로그래밍)에 대한 다양한 기사를 읽으면서 프로그래밍에 캡슐화숨기기 라는 두 가지 일반적인 개념이 관련되어 있다는 사실을 알게 되었을 것입니다 . 그리고 저자는 "캡슐화"라는 단어를 사용하여 한 가지를 의미하고 다른 것을 의미합니다. 완전한 이해를 얻을 수 있도록 두 용어를 모두 살펴보겠습니다. 프로그래밍에서 캡슐화 의 원래 의미는 데이터를 해당 데이터에서 작동하는 메서드와 함께 단일 단위 (예: "캡슐") 로 묶는 것입니다 . Java에서 클래스는 캡슐화의 단위입니다. 클래스에는 데이터 (필드)와 이 데이터로 작업하기 위한 메서드가 모두 포함되어 있습니다.캡슐화의 원리 - 3이것은 분명히 올바른 접근 방식처럼 보일 수 있지만 다른 프로그래밍 패러다임에서는 모든 것이 다르게 배열됩니다. 예를 들어 함수형 프로그래밍에서 데이터는 작업과 엄격하게 구분됩니다. OOP에서 프로그램은 데이터와 해당 데이터로 작업하기 위한 함수로 구성된 캡슐 또는 클래스로 구성됩니다. 이제 은폐 에 대해 이야기해 봅시다 . 어떻게 구성되어 있고 어떻게 작동하는지 이해하지 못한 채 모든 종류의 복잡한 장치를 사용하는 것은 어떻습니까? 간단합니다. 제작자가 간단하고 편리한 인터페이스를 제공했습니다.. 소다 기계에서 인터페이스는 패널의 버튼입니다. 하나의 버튼을 누르면 컵 크기를 선택할 수 있습니다. 다른 것을 누르면 맛을 선택합니다. 세 번째는 얼음 추가를 담당합니다. 그리고 그것이 당신이 해야 할 전부입니다. 기계의 내부 구성은 중요하지 않습니다. 중요한 것은 사용자가 탄산음료를 얻기 위해 세 개의 버튼을 눌러야 하는 방식으로 설계되었다는 것입니다 . 자동차에 대해서도 마찬가지입니다. 내부에서 무슨 일이 일어나고 있는지는 중요하지 않습니다. 중요한 것은 오른쪽 페달을 밟으면 차가 앞으로 가고 왼쪽 페달을 밟으면 속도가 느려진다는 것입니다.. 그것이 바로 숨기는 것입니다. 프로그램의 모든 "내부"는 사용자에게 숨겨져 있습니다. 사용자에게는 이러한 불필요하고 불필요한 정보입니다. 사용자에게는 내부 프로세스가 아닌 최종 결과가 필요합니다. Auto클래스를 예로 들어 보겠습니다 .

public class Auto {

   public void go() {

       /* Some complicated things happen inside the car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside the car.
       As a result, it slows down. */
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // From the user's perspective,

       // one pedal is pressed and the car accelerates.
       auto.gas();
      
       // The other is pressed, and the car slows down.
       auto.brake();
   }
}
다음은 Java 프로그램에서 구현 숨기기의 모습입니다. 실생활과 똑같습니다. 사용자에게 인터페이스(메서드)가 제공됩니다. 사용자가 작업을 수행하기 위해 프로그램에서 자동차가 필요한 경우 원하는 메서드를 호출하기만 하면 됩니다. 이러한 메서드 내에서 일어나는 일은 불필요합니다. 중요한 것은 모든 것이 정상적으로 작동한다는 것입니다. 여기서 우리는 구현 숨기기 에 대해 이야기하고 있습니다 . 그 외에도 Java에는 데이터 숨기기가 있습니다 . 우리는 게터와 세터에 대한 수업 에서 그것에 대해 썼지 만, 개념을 복습하는 것은 나쁘지 않을 것입니다. 예를 들어 다음과 같은 클래스가 있습니다 Cat.

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

  
}
지난 수업에서 이 수업의 문제를 기억하시나요? 그렇지 않다면 지금 기억합시다. 문제는 데이터(필드)가 모든 사람에게 공개되어 있다는 것입니다. 다른 프로그래머는 가중치가 0이고 나이가 -1000년인 이름 없는 고양이를 쉽게 만들 수 있습니다.

public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
동료 중 한 명이 잘못된 상태의 객체를 생성했는지 여부를 면밀히 주시할 수 있지만 이러한 "잘못된 객체"를 생성할 가능성조차 배제하는 것이 훨씬 좋습니다. 캡슐화의 원리 - 4다음 메커니즘은 데이터 은닉을 달성하는 데 도움이 됩니다.
  1. 액세스 수정자( 개인 , 보호 , 패키지 기본값 )
  2. 게터와 세터
예를 들어 누군가가 고양이의 나이에 음수를 할당하려고 하는지 확인하기 위해 거기에 체크를 할 수 있습니다. 앞에서 말했듯이 캡슐화에 대한 다양한 기사의 저자는 때때로 데이터와 메서드를 결합하거나 숨기거나 둘 다(결합 및 숨기기)를 의미합니다. Java에는 두 가지 메커니즘이 모두 있으므로(다른 OOP 언어의 경우 반드시 해당되는 것은 아님) 마지막 의미가 가장 정확합니다. 캡슐화는 몇 가지 중요한 이점을 제공합니다.
  1. 개체의 올바른 상태를 제어합니다. 위와 같은 예가 있었습니다. setter와 private 한정자는 프로그램에 가중치가 0인 고양이가 없도록 합니다.

  2. 인터페이스를 통한 사용자 친화성. 메서드만 외부 세계에 "노출"됩니다. 메서드를 호출하는 것만으로도 결과를 얻을 수 있습니다. 작동 방식에 대한 세부 정보를 조사할 필요가 전혀 없습니다.

  3. 코드 변경은 사용자에게 영향을 미치지 않습니다. 메서드 내에서 모든 변경 사항을 적용합니다. 이는 메서드 사용자에게 영향을 미치지 않습니다. 이전에 올바른 코드가 가속 페달을 적용하기 위한 "auto.gas()"였다면 계속 그럴 것입니다. 우리가 gas() 메서드 내부에서 무언가를 변경했다는 사실은 사용자에게 보이지 않습니다. 이전과 마찬가지로 호출자는 단순히 원하는 결과를 받습니다.