JavaRush /Java Blog /Random-KO /Java의 캡슐화 원칙

Java의 캡슐화 원칙

Random-KO 그룹에 게시되었습니다
안녕하세요! 오늘 강의는 캡슐화에 대해 집중적으로 다루겠습니다. 예제를 통해 바로 시작하겠습니다 :) 여러분 앞에는 익숙한 탄산음료 자판기가 있습니다. 한 가지 질문이 있습니다. 어떻게 작동하나요? 유리가 어디서 왔는지, 내부 온도가 어떻게 유지되는지, 얼음이 어디에 저장되어 있는지, 기계가 추가할 시럽을 어떻게 이해하는지 등에 대해 자세히 답변해 보십시오. 아마도 당신은 이러한 질문에 대한 답을 갖고 있지 않을 것입니다. 글쎄, 모든 사람이 그런 기계를 사용하는 것은 아닐 수도 있고 요즘에는 그다지 인기가 없습니다. 또 다른 예를 들어 보겠습니다. 매일 여러 번 사용한다는 것을 알고 있는 것입니다. 아, 나한테 아이디어가 있어! Google 검색 엔진이캡슐화 원리 - 2 어떻게 작동하는지 알려주세요 . 입력한 단어를 기반으로 정보를 정확히 어떻게 검색합니까? 왜 이 결과는 상위에 있고 다른 결과는 아닌가요? 매일 Google을 사용하더라도 아마도 이를 모르고 있을 것입니다. 그러나 그것은 중요하지 않습니다. 결국, 당신은 이것을 알 필요가 없습니다. 검색 엔진이 정확히 어떻게 작동하는지 생각하지 않고도 검색 엔진에 쿼리를 입력할 수 있습니다. 어떻게 작동하는지 모르더라도 자동판매기에서 탄산음료를 구입할 수 있습니다. 내연 기관의 작동을 탐구하지 않고도, 심지어 학교 수준에서도 물리학을 전혀 몰라도 자동차를 운전할 수 있습니다. 이 모든 것은 객체 지향 프로그래밍의 주요 원칙 중 하나인 캡슐화 덕분에 가능합니다 . 이 주제에 대한 다양한 기사를 읽으면서 프로그래밍에 캡슐화숨기기 라는 두 가지 공통 개념이 있다는 사실을 접했을 것입니다 . 그리고 "캡슐화"라는 단어는 저자가 (실제로는) 이런 저런 의미를 의미합니다. 우리는 귀하가 완전한 이해를 가질 수 있도록 두 용어를 모두 분석할 것입니다. 프로그래밍에서 " 캡슐화 " 라는 단어의 원래 의미는 데이터와 이 데이터를 사용하여 작업하는 방법을 하나의 패키지("캡슐")에 결합한 것 입니다 . Java에서 클래스는 캡슐 패키지 역할을 합니다 . 클래스에는 데이터 (클래스 필드)와 이 데이터를 사용하기 위한 메서드가 모두 포함되어 있습니다. 이것은 당신에게 명백한 것처럼 보이지만 다른 프로그래밍 개념에서는 모든 것이 다르게 작동합니다. 예를 들어, 함수형 프로그래밍에서 데이터는 해당 작업과 엄격하게 분리됩니다. OOP(객체 지향 프로그래밍)에서 프로그램은 작업을 위한 데이터이자 함수인 캡슐 클래스로 구성됩니다. 이제 숨기기 에 대해 이야기 해 봅시다 . 우리는 어떻게 작동하는지, 작동의 기반이 무엇인지 이해하지 못한 채 온갖 종류의 복잡한 메커니즘을 사용하는 걸까요? 간단합니다. 제작자가 간단하고 사용자 친화적인 인터페이스를 제공했습니다.캡슐화 원리 - 3. 탄산음료 기계에서 인터페이스는 패널에 있는 버튼입니다. 버튼 하나를 누르면 유리의 양이 선택됩니다. 두 번째 버튼을 누르면 시럽이 선택됩니다. 세 번째는 얼음 추가를 담당합니다. 그게 당신이 해야 할 전부입니다. 기계 내부가 얼마나 정확하게 설계되었는지는 중요하지 않습니다. 가장 중요한 것은 탄산음료를 얻으려면 사용자가 세 개의 버튼을 눌러야 하는 방식으로 설계되었다는 것 입니다 . 자동차도 마찬가지다. 그 사람 안에서 무슨 일이 일어나고 있는지는 중요하지 않습니다. 가장 중요한 점은 오른쪽 페달을 밟으면 차가 앞으로 나아가고, 왼쪽 페달을 밟으면 속도가 느려진다는 것 입니다 . 이것이 바로 은폐의 본질이다. 프로그램의 모든 "내부"는 사용자에게 숨겨져 있습니다. 그에게 이 정보는 불필요하고 불필요합니다. 사용자에게는 내부 프로세스가 아닌 최종 결과가 필요합니다. 클래스를 예로 들어 보겠습니다 Auto.
public class Auto {

   public void gas() {

       /*some complicated things are happening inside the car
       as a result of which it goes forward*/
   }

   public void brake() {

       /*some complicated things are happening inside the car
       as a result of which it slows down*/
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // How everything looks to the user

       //pressed one pedal - went
       auto.gas();

       //pressed another pedal - braked
       auto.brake();
   }
}
이것이 Java 프로그램에서 구현 숨기기의 모습입니다. 모든 것이 실제 생활과 같습니다. 사용자에게 인터페이스(메서드)가 제공됩니다. 작업을 수행하기 위해 프로그램에 자동차가 필요한 경우 원하는 메서드를 호출하기만 하면 됩니다. 그리고 이러한 메서드 내에서 일어나는 일은 불필요한 정보입니다. 가장 중요한 것은 모든 것이 제대로 작동한다는 것입니다. 여기서 우리는 구현을 숨기는 것에 대해 이야기했습니다 . 이 외에도 Java에는 데이터 숨기기 기능 도 있습니다 . 우리는 getter와 setter에 대한 강의 에서 이에 대해 썼지 만 다시 상기시켜도 나쁠 것 없습니다. 예를 들어 다음과 같은 클래스가 있습니다 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. 접근 수정자( private , protected , package default );
  2. 게터와 세터.
예를 들어 누군가가 고양이의 나이에 음수를 할당하려고 하는지 확인할 수 있습니다. 앞서 말했듯이 캡슐화에 관한 다양한 기사의 저자는 캡슐화(데이터와 방법 결합) 또는 숨기기 또는 둘 다를 의미합니다. Java에는 두 가지 메커니즘이 모두 있으므로(다른 OOP 언어에서는 반드시 그런 것은 아닙니다) 후자의 옵션이 가장 정확합니다. 캡슐화를 사용하면 다음과 같은 몇 가지 중요한 이점이 있습니다.
  1. 개체의 올바른 상태를 모니터링합니다. 위에 이에 대한 예가 있습니다. setter와 private 수정자 덕분에 우리는 체중이 0인 고양이로부터 프로그램을 보호했습니다.

  2. 인터페이스로 인한 사용자 친화성. 사용자 액세스를 위해 “외부” 메소드만 남겨둡니다. 그가 해야 할 일은 결과를 얻기 위해 그들에게 전화하는 것 뿐이며, 그들의 작업에 대한 세부 사항을 전혀 조사할 필요가 없습니다.

  3. 코드 변경 사항은 사용자에게 영향을 주지 않습니다. 메소드 내부에서 모든 변경을 수행합니다. 이는 사용자에게 영향을 미치지 않습니다. 그는 자동차 연료에 대해 auto.gas()를 작성했으므로 이를 작성할 것입니다. 그리고 gas() 메소드의 작동에서 우리가 무언가를 변경했다는 사실은 그에게 보이지 않을 것입니다. 그는 이전과 마찬가지로 단순히 원하는 결과를 받게 될 것입니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION