[java] 캡슐화 vs 추상화?

다음은 캡슐화 및 추상화에 대한 간략한 정의입니다.

추출:

Java의 추상화 프로세스는 특정 세부 사항을 숨기고 오브젝트의 필수 기능 만 표시하는 데 사용됩니다. 즉, 객체 (인터페이스)의 외부 뷰를 처리합니다. 다른 사이트에서 이것을 볼 수있는 유일한 좋은 예는 인터페이스입니다.

캡슐화 :

기본적으로 private, public, protected 등과 같은 수정 자의 도움으로 객체 상태를 숨기는 것에 관한 것입니다. 필요한 경우에만 공개 메소드를 통해 상태를 노출합니다.

처럼 우리는 수정과 달성 무엇을 private, public또한 아무것도뿐만 아니라 추상화 개념없는 측면 세상 밖으로에서 불필요한 세부 사항을 숨 깁니다

위의 설명에서 캡슐화는 추상화의 일부이거나 추상화의 일부라고 말할 수 있습니다. 그렇다면 왜 캡슐화 용어가 추상화만을 다룰 수있을 때 발명 되었는가? 나는 그것들을 구별하는 큰 차이가있을 것이라고 확신하지만 그물에있는 대부분의 자료는 두 가지에 대해 거의 같은 것을 말합니다.

이 질문은이 포럼에서도 일찍 제기되었지만 구체적인 의심으로 다시 게시하고 있습니다. 일부 응답자들은 또한 추상화는 개념이고 캡슐화는 구현이라고 말합니다. 그러나 나는 이것을 사지 않습니다-그것이 사실이라면,이 두 가지 다른 개념이 우리를 혼란스럽게한다고 생각할 수 있습니다.

업데이트 : -5 년 후 나는이 게시물과 아래의 답변을 기반으로 요점 인 내 자신의 답변을 생각해 냈습니다.

  1. 추상화와 캡슐화의 차이?
  2. 캡슐화 vs 추상화 실제 예제


답변

캡슐화 는 추상화의 일부로 사용되는 전략입니다. 캡슐화는 객체의 상태를 나타냅니다. 객체는 상태를 캡슐화하고 외부에서 숨 깁니다. 클래스의 외부 사용자는 메소드를 통해 클래스와 상호 작용하지만 클래스 상태에 직접 액세스 할 수는 없습니다. 따라서 클래스 는 상태와 관련된 구현 세부 사항을 추상화 합니다.

추상화 는보다 일반적인 용어이며, (다른 것들 중에서도) 서브 클래 싱으로도 달성 할 수 있습니다. 예를 들어, List표준 라이브러리 의 인터페이스 는 일련의 항목에 대한 추상화이며, 위치에 따라 색인이 생성되며, 구체적인 예 ListArrayList또는입니다 LinkedList. List사용중인 목록의 세부 사항에 대해 초록 과 상호 작용하는 코드입니다 .

캡슐화로 기본 상태를 숨기지 않고 추상화를 수행 할 수없는 경우가 종종 있습니다. 클래스가 내부 상태를 노출하면 내부 작업을 변경할 수 없으므로 추상화 할 수 없습니다.


답변

추상화 는 중요한 용어에 초점을 맞추기 위해 간단한 용어로, 즉 세부 사항을 추상화하는 개념입니다 (예 : 아티스트가 이미지와 같은 이미지의 빌딩 블록에 초점을 맞추는 추상 예술에서도 볼 수 있습니다) 색깔 또는 모양). 동일한 개념이 상속 계층 구조를 사용하여 OOP로 변환되며, 더 추상적 인 개념이 맨 위에 있고, 더 구체적인 개념이 맨 아래에 있으며, 추상 개념을 기반으로합니다. 가장 추상적 인 수준에는 구현 세부 사항이 전혀 없으며 아마도 공통성이 거의 없으며 추상화가 감소함에 따라 추가됩니다.

예를 들어, 맨 위에 단일 메소드가있는 인터페이스가있을 수 있고 다음 레벨은 몇 가지 추상 클래스를 제공합니다.이 클래스는 최상위 레벨에 대한 세부 사항을 채우거나 채우지 않을 수도 있지만 자체 추상 메소드를 추가하여 분기합니다. 그런 다음 이러한 추상 클래스 각각에 대해 나머지 모든 메소드의 구현을 제공하는 구체적인 클래스입니다.

캡슐화기술 입니다. 추상화를 돕기위한 것일 수도 있고 아닐 수도 있지만, 정보 숨기기 및 / 또는 조직에 관한 것입니다. 그것은 데이터와 기능이 어떤 방식으로 그룹화 될 것을 요구합니다. 물론 좋은 OOP 관행은 추상화에 의해 그룹화되어야합니다. 그러나 유지 보수성 등을 돕는 다른 용도가 있습니다.


답변

캡슐화는 추상화의 일부이거나 추상화의 하위 세트라고 말할 수 있습니다.

그것들은 다른 개념입니다.

  • 추상화는 객체의 불필요하거나 중요하지 않은 속성을 모두 제거하고 도메인에 가장 적합한 특성 만 유지하는 프로세스입니다.

    예 : 사람 : 이름과 성 및 SSN을 유지하기로 결정합니다. 나이, 신장, 체중 등은 관련이없는 것으로 무시됩니다.

    추상화는 디자인이 시작되는 곳입니다.

  • 캡슐화는 추상화 프로세스 중에 유지하도록 허용 된 속성에 적합한 작업을 인식하는 다음 단계입니다. 데이터와 데이터에 작용하는 작업을 연관시킵니다.
    즉 데이터와 메소드가 함께 번들로 제공됩니다.

답변

캡슐화가 캡슐 또는 장치에 불필요한 데이터를 숨기고 있음

추상화는 객체의 필수 기능을 보여줍니다

캡슐화는 외부 클래스 및 인터페이스에서 멤버를 숨기는 데 사용됩니다. public, private, protected 등 c #.에서 제공되는 액세스 수정 자 사용 예 :

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

여기에 단위 또는 캡슐 즉 클래스로 랩 데이터가 있습니다.

추상화는 캡슐화의 반대입니다.

추상화는 중요한 관련 데이터를 사용자에게 보여주기 위해 사용됩니다. 가장 실제적인 예 휴대폰에서는 카메라, mp3 플레이어, 통화 기능, 녹음 기능, 멀티미디어 등과 같은 다양한 유형의 기능을 볼 수 있습니다. 내부 엔지니어링 대신 관련 정보 만 볼 수 있기 때문에 추상화입니다.

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }


답변

추상화는 매우 일반적인 용어이며 소프트웨어의 추상화는 객체 지향 언어로 제한되지 않습니다. 사전 정의 : “구체적인 현실, 특정 대상 또는 실제 사례를 제외하고 어떤 것을 일반적인 품질 또는 특성으로 간주하는 행위”.

어셈블리 언어는 기계어 코드의 추상화로 생각할 수 있습니다. 어셈블리는 기계어 코드의 필수 세부 사항과 구조를 표현하지만 사용 된 opcode, 메모리의 코드 레이아웃, 점프로의 전환에 대해 생각할 필요가 없습니다. 올바른 주소 등

운영 체제의 API는 기본 시스템의 추상화입니다. 컴파일러는 어셈블리 언어의 세부 사항으로부터 보호하는 추상화 계층을 제공합니다. 운영 체제에 내장 된 TCP / IP 스택은 네트워크를 통해 비트를 전송하는 세부 정보를 추상화합니다. 원시 실리콘으로 내려 가면 CPU를 설계 한 사람들은 전자가 반도체 결정을 통과하는 방식의 추상화 인 “다이오드”및 “트랜지스터”로 작성된 회로도를 사용하여 그렇게했습니다.

소프트웨어에서 모든 것은 추상화입니다. 우리는 현실의 일부 측면을 시뮬레이션하거나 모델링하는 프로그램을 구축하지만, 필요에 따라 모델은 항상 “실제”에 대한 세부 사항을 추상화합니다. 우리는 추상화 계층에 레이어에 레이어를 구축합니다. (스도쿠 솔버를 만들려고하는데 반도체 결정 만 사용하여 설계해야한다고 상상해보십시오. “여기 N 형 실리콘이 필요합니다 …”

이에 비해 “캡슐화”는 매우 구체적이고 제한된 용어입니다. 이 질문에 대한 다른 답변 중 일부는 이미 좋은 정의를 제공했습니다.


답변

5 년이 지난 후에도 여전히 자세한 내용이 필요하다고 생각하는 내 자신의 질문에 대답

추출:

기술 정의 :-
추상화는 불필요한 세부 사항 (복잡하거나 간단한)을 숨기고 객체의 필수 기능 만 보여주는 개념입니다. 여기에는 개념이 구현되어 있지 않습니다.

그것이 의미하는 바 :- 회사에 직원이 고객과 연결할 수 있도록 약간의 매체 / 장치가 필요하다고 말할 때. 이것은 장치 / 매체가 전화, 인터넷 또는 스카이프 또는 개인 또는 전자 메일 등이 될 수 있기 때문에 가장 순수한 형태의 abstaction (java의 인터페이스와 같은)입니다.

회사에 직원이 음성 통화를 통해 고객과 연결할 수 있도록 매체 / 장치가 필요하다고 말할 때에도 마찬가지입니다. 그런 다음 추상적 인 이야기를하고 있지만 장치 / 매체는 전화 또는 스카이프 또는 기타가 될 수 있으므로 조금 낮은 수준입니다.

직원들이 음성 통화를 통해 고객과 연결할 수 있도록 회사에 전화가 필요하다고 말합니다. 그런 다음 전화는 아이폰이나 삼성 또는 노키아 등의 회사가 될 수 있으므로 추상적이지만 조금 낮은 수준으로 이야기하고 있습니다.

캡슐화 :-
기본적으로 private, public, protected 등과 같은 수정 자의 도움으로 객체의 상태 (정보)를 숨기는 것에 관한 것입니다. 필요한 경우에만 공개 메소드를 통해 상태를 노출시킵니다.

그것이 실제로 의미하는 바 :-
이제 회사에 직원이 음성 통화를 통해 고객과 연결할 수 있도록 일부 iPhone이 필요합니다. 이제 iPhone과 같은 구체적인 물체에 대해 이야기하고 있습니다. 비록 여기에서도 아이폰의 핵심에 빠지지 않지만 아이폰은 장치 / 매체가없는 곳과 관련된 상태 / 콘크리트 정보 / 구현을 가지고 있습니다. 구체적인 객체를 말할 때 실제로는 (Java 추상 클래스와 같이 완전하지 않은) 구현 / 정보가 연결된 모든 객체를 의미합니다.

따라서 iPhone은 실제로 캡슐화를 상태 / 정보를 숨기고 노출되어야한다고 생각되는 것만 노출시키는 전략으로 사용했습니다. 따라서 추상화와 캡슐화는 불필요한 세부 사항을 숨기고 개념 수준에서는 추상화를 구현하고 실제로 구현 수준에서는 캡슐화를 숨 깁니다.

이것은이 게시물과 아래의 답변을 기반으로하는 요점입니다.

  1. 추상화와 캡슐화의 차이?
  2. 캡슐화 vs 추상화 실제 예제

답변

캡슐화 -외부에서 직접 액세스하지 못하도록 클래스의 구성 요소를 숨기는 프로세스입니다. “private”수정자를 사용하여 다른 클래스 나 객체에서 일부 클래스 멤버 (데이터 필드 또는 메서드)에 직접 액세스하는 것을 방지하면서 동시에 공개 멤버 (인터페이스)가 이러한 개인 멤버에 액세스 할 수 없습니다. 이것은 반원들이 피부 나 방패 아래에 숨겨져 있거나 캡슐화 된 인간 장기로 보호되게합니다.

추상화 -OOP 프로그램을 작성할 때 원칙을 따라야합니다. “프로그램에 관심있는 구성 요소 만 수업에 포함시켜야합니다.” 예를 들어, 대상 학생의 이름, 나이, 몸무게, 머리카락 색, 눈동자 등 사람이 많은 캐릭터를 가지고 있습니다. 그러나 OOP에서 수업을 만들 때 학생들과 함께 일할 때는 실제로 그 캐릭터 만 포함해야합니다. 학생 데이터베이스의 문제 : 이름, 나이, 전문, 레벨, 마크 등 C ++에서 클래스의 모든 메소드와 함께 “가상”수정자를 사용하여 추상 클래스를 작성할 수 있으며 직접 사용할 수는 없지만 다른 클래스를 파생시키고 작업을 기반으로 필요한 멤버를 추가하여 멤버에 대한 구현을 만듭니다.