CodeGym /Java Blog /무작위의 /자바 캡슐화
John Squirrels
레벨 41
San Francisco

자바 캡슐화

무작위의 그룹에 게시되었습니다
안녕! 우리는 오늘의 수업을 Java의 캡슐화에 할애하고 게이트에서 바로 예제로 시작할 것입니다. :) 여기에 일반적인 소다 디스펜싱 머신이 있습니다 . 한 가지 질문이 있습니다. 어떻게 작동합니까? 자세한 답변을 제공하십시오. 소다는 어디에서 왔습니까? 내부 온도는 어떻게 유지됩니까? 얼음은 어디에 보관되나요? 기계는 추가할 시럽을 어떻게 압니까? 아마도 이러한 질문에 대한 답이 없을 것입니다. 모든 사람이 이 기계를 사용하는 것은 아닐 수도 있습니다. 그들은 현재 그다지 인기가 없습니다. 다른 예를 들어보겠습니다. 당신이 확실히 매일 여러 번 사용하는 것. 오, 나에게 아이디어가 있어! Google 검색 엔진이캡슐화의 원리 - 2 어떻게 작동하는지 알려주세요.공장. 입력한 단어에 대한 정보를 정확히 어떻게 검색합니까? 이 결과가 다른 결과가 아닌 상단에 있는 이유는 무엇입니까? 매일 Google을 사용하지만 아마 모를 것입니다. 그러나 그것은 중요하지 않습니다. 결국, 그것은 당신이 알아야 할 것이 아닙니다. 정확히 어떻게 작동하는지 생각하지 않고 검색 엔진을 사용할 수 있습니다. 제조 방법을 모른 채 기계에서 탄산음료를 구입할 수 있습니다. 내연 기관이 어떻게 작동하는지 탐구하지 않고 고등학교 물리학을 몰라도 자동차를 운전할 수 있습니다. 이것은 객체 지향 프로그래밍의 주요 원칙 중 하나인 캡슐화 덕분에 가능합니다. 이 주제에 대한 여러 기사를 읽으면서 캡슐화와 정보 은닉이라는 두 가지 널리 퍼진 프로그래밍 개념을 접했을 것입니다. 공교롭게도, 다른 사람들은 '라는 단어를 이해합니다. 캡슐화'는 다른 것을 의미합니다. 우리는 당신이 완전히 이해할 수 있도록 두 용어를 모두 해독할 것입니다. 프로그래밍에서 의 원래 의미는캡슐화는 하나의 패키지("캡슐")에서 해당 데이터로 작업하기 위해 데이터와 방법을 결합하는 것이었습니다. Java에서 캡슐화 패키지는 클래스 입니다 . 클래스에는 데이터 (필드)와 해당 데이터 작업을 위한 메서드가 모두 포함되어 있습니다. 캡슐화의 원리 - 3이것은 당신에게 명백해 보일 수 있지만 다른 프로그래밍 패러다임에서는 모든 것이 다르게 배열됩니다. 예를 들어 함수형 프로그래밍에서 데이터는 데이터 작업과 엄격하게 구분됩니다. 객체 지향 프로그래밍(OOP)에서 프로그램은 데이터와 데이터 작업을 위한 함수로 구성된 캡슐(클래스)로 구성됩니다.

이제 정보 은닉에 대해 알아보겠습니다.

구축 방식이나 작동 방식을 이해하지 않고 모든 종류의 복잡한 메커니즘을 어떻게 사용합니까? 간단합니다. 제작자가 간단하고 편리한 인터페이스를 제공했습니다. 소다 기계에서 인터페이스는 전면 패널의 버튼입니다. 버튼 하나로 컵 크기를 선택할 수 있습니다. 두 번째 버튼으로 시럽을 선택합니다. 세 번째는 얼음 추가를 담당합니다. 그리고 그것이 당신이 해야 할 전부입니다. 기계 내부가 어떻게 생겼는지는 중요하지 않습니다. 중요한 것은 사용자가 세 개의 버튼을 눌러 탄산음료를 얻을 수 있도록 설계되었다는 것입니다. 자동차도 마찬가지입니다. 내부에서 무슨 일이 일어나고 있는지는 중요하지 않습니다. 중요한 것은 오른쪽 페달을 밟으면 차가 앞으로 가고, 왼쪽 페달을 밟으면 차가 느려진다는 것입니다. 이것이 정보은닉의 본질이다. 프로그램의 모든 것' s 'innards'는 사용자에게 숨겨져 있습니다. 이러한 정보는 사용자에게 불필요하거나 불필요합니다. 사용자에게는 내부 프로세스가 아닌 최종 결과가 필요합니다. 예를 들어 다음을 살펴보겠습니다.차량 등급:

public class Vehicle {

   public void gas() {

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

   public void brake() {

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

   public static void main(String[] args) {

       Vehicle vehicle = new Vehicle();

       // How everything looks to the user

       // Press one pedal, the car moves
       vehicle.gas();

       // Press the other pedal, the car brakes
       vehicle.brake();
   }
}
이것이 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. 코드 변경은 사용자에게 영향을 미치지 않습니다. 메서드 내에서 모든 변경을 수행합니다. 이것은 사용자에게 영향을 미치지 않습니다. 그들은 가스를 적용하기 위해 vehicle.gas()를 작성했고, 계속해서 그렇게 할 것입니다. 우리가 gas() 메서드 내부에서 무언가를 변경했다는 사실은 보이지 않습니다. 이전과 마찬가지로 필요한 결과를 얻습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION