캡슐화 vs 추상화?


137

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

추출:

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

캡슐화 :

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

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

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

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

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

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

위에서 정의 된 캡슐화는 추상화의 도구이지만 클래스가 캡슐화하는 것 (액세스에 관계없이 기능 / 데이터)으로 추상화하는 경향이 있습니다. 그것이 완료되었고 정확히 행해진 것은 Wikipedia에서 가능합니다An 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
TI

캡슐화는 컨텍스트와 관련된 관련 세부 정보 (데이터에서 작동하는 데이터 및 동작)를 더 바인딩합니다. 또한 private public인스턴스의 데이터를 보호하는 것이 좋습니다.
user3227986

답변:


98

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

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

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


8
캡슐화는 관련 속성, 메서드 및 기타 멤버 그룹이 단일 단위 또는 개체로 취급됨을 의미합니다. msdn.microsoft.com/ko-kr/library/dd460654.aspx
raberana

1
캡슐화는 추상화로 이어집니다.
Martin

124

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

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

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


13
추상화에 대한 당신의 정의는 내가 본 것 중 최고이며, 처음으로 느낌이 들었습니다. 실제로 내 머리를 클릭하고 말이되었습니다. 이 글을 게시 한 지 3 년이 지났다는 것을 알고 있지만 감사합니다.
Casey Crookston

1
와우 .... 추상화 .... 예술의 관점에서 표현 된 .. 빨간색은 분노일지도 모른다. 그것이 우리가 알아야 할 전부이다! 이 개념의 관점에 감사드립니다 :-)
SlowLearner

캡슐화는 "느슨한 커플 링 및 높은 응집력"을 달성하는 데 사용됩니다.
Sorter

28

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

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

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

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

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

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

추상화는 일종의 디자인 컨셉이라고 말할 수 있습니까? 캡슐화는 주로 추상화 중에 동의 한 디자인의 구현에 관심이 있습니까?
M Sach

1
캡슐에서 당신은 / well.Eg가 SSN을 검색 같은 디자인의 일부가 될 수 있습니다 data.This에 적용해야 할 작업을 정의하지만 그것을 수정할 수 없습니다
Cratylus

25

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

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

캡슐화는 외부 클래스 및 인터페이스에서 멤버를 숨기는 데 사용됩니다. 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();

    }

나는 동의한다. 이 사람들은 다소 반대입니다. 좋은 oop은 변하지 않는 것들을 추상화하고 [변하는 팅을 캡슐화 함] [1]. [1] : 원리
-wiki.net/…

15

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

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

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

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

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


14

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

추출:

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

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

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

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

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

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

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

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

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

5

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

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


4

이것이 내가 이해 한 방법입니다.

객체 지향 프로그래밍에는 classes 라는 것이 있습니다 . 그들은 무엇입니까? 그들은 어떤 상태를 저장하고 그 상태를 변경하기 위해 어떤 방법을 저장해야한다. 즉, 상태와 그 방법을 캡슐화 하고있다.

그것 (클래스)은 자신이나 그 내용의 가시성을 신경 쓰지 않습니다. 우리는 경우 숨길 수 주 또는 몇 가지 방법을, 그 것이다 정보 숨어 .

이제 상속 시나리오를 봅시다 . 기본 클래스와 파생 (상속 된) 클래스가 있습니다. 그렇다면 기본 수업은 무엇입니까? 그것은되는 추상화 파생 클래스에서 몇 가지를.

그들 모두 다르 지요? 그러나 우리는 그것들을 혼합하여 좋은 객체 지향 프로그램을 작성합니다. 그것이 도움이되기를 바랍니다 :)


3

추상화 는 상황에 따라 단순화 된 것을 표현합니다. 문맥 상 관련이없는 세부 사항을 무시하고 문맥 상 중요한 세부 사항을 포함합니다.

캡슐화 는 무언가에 대한 외부 액세스를 제한 하고 해당 상태를 사용하는 절차와 해당 상태를 묶습니다 .


예를 들어 사람들을 데려가십시오. 수술의 맥락에서 유용한 추상화는 사람의 종교적 신념을 무시하고 사람의 몸을 포함합니다. 또한 사람들은 그 기억을 사용하는 사고 과정으로 기억을 캡슐화합니다. 추상화에는 캡슐화가 필요하지 않습니다. 예를 들어, 사람의 그림은 그 부분을 숨기거나 절차와 상태를 묶지 않습니다. 그리고 캡슐화에는 관련 추상화가 필요하지 않습니다. 예를 들어, 실제 사람들 (추상적 인 사람은 아님)은 자신의 장기를 신진 대사로 캡슐화합니다.


1

참고 : 나는 이것을 공유하고 있습니다. 여기에 좋은 대답이 아니라 쉽게 이해할 수 있다는 의미는 아닙니다.

대답:

클래스가 개념화되면 컨텍스트에서 주어진 특성은 무엇입니까? 동물원의 맥락에서 Animal 클래스를 디자인하는 경우 가축 또는 야생을 설명하기 위해 animalType 속성을 갖는 것이 중요합니다. 이 속성은 다른 컨텍스트에서 클래스를 디자인 할 때 의미가 없을 수 있습니다.

마찬가지로, 우리가 수업에서하게 될 행동은 무엇입니까? 여기에도 추상화가 적용됩니다. 여기에 무엇이 필요하고 과다 복용은 무엇입니까? 그런 다음 수업에서 일부 정보를 차단했습니다. 이 프로세스는 추상화를 적용하고 있습니다.

캡슐화와 추상화의 차이점을 요청할 때 캡슐화 는 추상화를 개념으로 사용합니다. 그렇다면 캡슐화뿐입니다. 아니요, 추상화는 상속과 다형성의 일부로 적용되는 개념이기도합니다.

이 주제에 대한 자세한 설명을 보려면 여기로 이동 하십시오.


1

다른 방식으로 이해하려고합니다.

추상화가 없으면 일어날 수있는 일과 캡슐화가 없으면 일어날 수있는 일

추상화가 없으면 객체의 사용량이 적다고 말할 수 있습니다. 객체를 식별하거나 객체의 기능에 액세스 할 수 없습니다. TV의 예를 들어보십시오. 전원을 켜거나 채널을 변경하거나 볼륨을 높이거나 낮추는 옵션이 없다면 TV 사용은 무엇이며 어떻게 사용합니까?

캡슐화가 없거나 제대로 구현되지 않으면 객체를 잘못 사용할 수 있습니다. 데이터 / 구성 요소에 의해 잘못 사용될 수 있습니다. TV의 동일한 예를 들어보십시오. TV 볼륨에 캡슐화가 없으면 볼륨 컨트롤러가 한계 이하 (0-40 / 50)를 초과하여 오용 될 수 있습니다.


1

캡슐화는 외부 엔티티에서 오브젝트 / 인스턴스의 내부 동작을 축소하도록 보호합니다. 따라서 공급되는 데이터가 존재 / 존재하기 위해 인스턴스 / 객체의 내부 시스템에 해를 끼치 지 않을 것임을 확인하는 제어 기능을 제공해야합니다.

좋은 예, Divider는 두 개의 인스턴스 변수 피제수와 제수와 getDividedValue 메소드를 가진 클래스입니다.

제수가 제로로 설정되면 내부 시스템 / 동작 (getDivided)이 중단 될 것이라고 생각할 수 있습니까?

따라서 메소드를 통해 예외를 발생시켜 오브젝트 내부 동작을 보호 할 수 있습니다.


0

간단한 문장에서, 나는 말합니다 : 추상화의 본질은 본질적인 세부 사항을 생략하면서 필수 속성을 추출하는 것입니다. 그러나 왜 우리는 본질적인 세부 사항을 생략해야합니까? 주요 동기는 변화의 위험을 방지하는 것입니다. 추상화는 캡슐화와 동일하다고 생각할 수 있습니다. 그러나 캡슐화 란 세부 사항을 숨기지 않고 하나 이상의 항목을 컨테이너 안에 넣는 행위를 의미합니다. "캡슐화 된 모든 것은 숨겨져 있습니다."라는 주장을한다면 이것은 사실이 아닙니다. 예를 들어, 정보가 레코드 구조 및 배열 내에 캡슐화 될 수 있지만이 정보는 일반적으로 숨겨지지 않습니다 (다른 메커니즘을 통해 숨겨져 있지 않은 경우).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.