추상화 VS 정보 숨기기 VS 캡슐화


167

소프트웨어 개발에서 추상화정보 숨기기 의 차이점은 무엇 입니까?

혼란 스러워요. 추상화는 세부 구현을 숨기고 정보 숨기기는 무언가의 전체 세부 사항을 추상화합니다.

업데이트 : 이 세 가지 개념에 대한 좋은 대답을 찾았습니다. 거기 에서 가져온 몇 가지 인용에 대해서는 아래의 별도 답변을 참조하십시오 .


"캡슐화는 숨겨져 야 할 것을 숨기고 보이는 것을 보이게하는 방식으로 정보를 포장하는 기술입니다." ; 캡슐화는 정보 숨기기를 통해 달성됩니다.
wulfgarpro


인용 꼬임 고장
Rishi Dua

답변:


152

소스로 이동하십시오! Grady Booch는 다음과 같이 말합니다 (객체 지향 분석 및 디자인, 49 페이지, 2 판).

추상화와 캡슐화는 상호 보완적인 개념입니다. 추상화는 객체의 관찰 가능한 행동에 중점을두고 있습니다. 캡슐화는 이러한 행동을 일으키는 구현에 중점을두고 있습니다. 캡슐화는 정보 숨기기를 통해 이루어집니다. 본질적인 특성에 기여하지 않는 대상의 비밀.

다시 말해서 : 추상화 = 외부의 객체; 캡슐화 (정보 숨기기를 통해 달성 됨) = 내부적으로 개체

예 : .NET Framework에서 System.Text.StringBuilder클래스는 문자열 버퍼에 대한 추상화를 제공합니다. 이 버퍼 추상화를 통해 구현에 관계없이 버퍼로 작업 할 수 있습니다. 따라서 StringBuilder내부적으로 버퍼 포인터와 같은 것들을 추적하고 버퍼가 가득 찼을 때 메모리를 관리 하는 방법에 관계없이 문자열을 버퍼에 추가 할 수 있습니다 (정보 숨기기를 통한 캡슐화로 수행).

rp


5
추상화와 캡슐화가 상호 보완적인 방식과 동일하게 캡슐화와 정보 숨기기도 상호 보완 적이라고 말할 수 있습니까? 물론 캡슐화는 정보 숨기기를 통해 이루어 지지만 ... 정보 캡슐화가 실현되는 메커니즘은 캡슐화되지 않습니까?
wulfgarpro

Booch의 정의에 대한 또 다른 실제 사례가 여기에 있습니다.
lifebalance

캡슐화는 서비스 코드 (즉, 캡슐화 된 클래스 자체) 관점에서 가장 잘 이해되는 반면 추상화는 클라이언트 코드 관점에서 가장 잘 이해된다고 말하는 것이 옳은지 말씀해 주시겠습니까?
user1338998

위의 정의에 대한 실제 예는 여기에 설명되어 있습니다. stackoverflow.com/a/635755/3181500
user3181500

83

OP는 자신이 찾은 여러 인용문, 즉 Edward V. Berard기사 "Abstraction, Encapsulation, and Information Hiding" 에서 그의 질문을 인용했습니다 . OP의 업데이트가 약간 확장되고 재 형식화 된 버전을 다시 게시하고 있습니다.

(모든 인용은 위에서 언급 한 기사에서 가져옵니다.)

추출:

"추상화에 관한 혼란의 한 지점은 프로세스와 실체로서의 사용이다. 프로세스로서의 추상화는 본질적인 세부 사항을 무시하면서 아이템 또는 아이템 그룹에 대한 필수 세부 사항을 추출하는 것을 나타낸다. 엔티티는 모델, 뷰 또는 실제 항목에 대한 다른 초점 표현을 나타냅니다. "

정보 숨기기 :

"인터페이스 또는 정의는 내부 작업에 대해 가능한 한 적게 공개하도록 선택되었습니다." — [Parnas, 1972b]

"숨겨져 야 할 정보를 식별하기위한 기술로 [...] 요약을 사용할 수 있습니다."

"사람들이 정보 숨기기와 어떤 정보를 숨길지를 식별하는 데 사용되는 기술 (예 : 추상화)을 구별하지 못하면 혼란이 발생할 수 있습니다."

캡슐화 :

"그것은 […] 어떤 것들의 수집 물 주위에 개념적 장벽 인 캡슐을 만드는 것을 말합니다." — [Wirfs-Brock et al, 1990]

"프로세스로서 캡슐화는 하나 이상의 항목을 […] 컨테이너 안에 넣는 행위를 의미합니다. 엔티티로서 캡슐화는 하나 이상의 항목을 보유 (포함, 포함)하는 패키지 또는 인클로저를 의미합니다."

"캡슐화가 '정보 숨기기와 같은 것'이라면 '캡슐화 된 모든 것도 숨겨져있다'는 주장을 할 수 있습니다. 이것은 사실이 아닙니다. "

결론:

"추상화, 정보 숨기기 및 캡슐화는 매우 다르지만 관련성이 높은 개념입니다. 추상화는 어떤 특정 정보를 볼 수 있는지, 어떤 정보를 숨겨야하는지 식별하는 데 도움이되는 기술이라고 주장 할 수 있습니다. 캡슐화는 그 기술입니다. "숨겨야 할 것을 숨기고 보이는 것을 보이게하는 방식으로 정보를 포장하기 위해."


실질적으로 좋은 설명. Java로 구체적인 예제를 제공하는 것이 좋습니다. 그 때문에 달성 자바 감추기 그 세터 / 게터를 내게 구현을 보이는 Information Hiding일반적인 반면 (또는 구현 숨어) class를 달성 한 캡슐화하고 추상화 통해 이루어진다 private액세스
abarik

57

Abstraction 기본 기능 위에 레이어를 제공하여 구현 세부 사항을 숨기고 있습니다.

Information Hiding해당 구현에 영향을받는 데이터를 숨기고 있습니다. 이 사용 privatepublic아래에 온다. 예를 들어 클래스의 변수를 숨 깁니다.

EncapsulationClass프로그래밍 과 같은 모든 유사한 데이터와 기능을 그룹에 넣는 것 ; Packet네트워킹에서.

클래스의 사용을 통해, 우리는 세 가지 개념을 구현 - Abstraction, Information HidingEncapsulation


33

간단한 개념을 복잡하게하지 마십시오.

캡슐화 : 데이터와 메소드를 단일 단위로 감싸는 것은 캡슐화입니다 (예 : 클래스)

추상화 : 배경 세부 사항을 포함하지 않고 필수 사항만을 나타내는 행위입니다. (예 : 인터페이스)

예 및 추가 정보 GOTO :

http://thecodekey.com/C_VB_Codes/Encapsulation.aspx

http://thecodekey.com/C_VB_Codes/Abstraction.aspx

여기에서 승인 된 정의

추신 : 또한 Sumita Arora가 C ++이라는 책의 정의를 기억합니다.


6

여기에서 의도 한 것과 가장 유사한 옥스포드 영어 사전 (OED)에 의해 주어진 추상화의 의미는 '생각에서 분리하는 행위'입니다. 더 나은 정의는 '배경이나 본질적인 세부 사항을 포함하지 않고 무언가의 필수 기능을 나타내는 것'일 수 있습니다.

정보 숨기기는 클래스와 같은 소프트웨어 구성 요소 사용자가 구성 요소를 초기화하고 액세스하는 방법에 대한 필수 세부 정보 만 알고 구현의 세부 사항을 알 필요가 없다는 원칙입니다.

편집 : 추상화는 구현의 어느 부분을 숨겨야 하는지를 결정하는 과정 인 것 같습니다 .

따라서 추상화 대 VERSUS 정보 숨기기. VIA 추상화를 숨기는 정보입니다.


4

추출

추상화는 배경 세부 사항을 포함하지 않고 essentail 세부 사항을 나타내는 행위입니다. 추상 클래스에는 메소드 서명 만 있고 구현 클래스는 자체 구현을 가질 수 있습니다. 이러한 방식으로 복잡한 세부 사항이 사용자에게 표시되지 않습니다. 추상화는 외부보기에 중점을 둡니다. 다시 말해, 추상화는 실제 구현에서 인터페이스를 분리하는 것입니다.

캡슐화

캡슐화는 데이터 멤버 및 메소드를 단일 단위로 바인딩하는 방법을 설명합니다. 정보 숨기기는 캡슐화의 주요 목적입니다. 캡슐화는 개인, 공용, 보호와 같은 액세스 지정자를 사용하여 달성됩니다. 클래스 멤버 변수는 비공개로 만들어 외부 세계에 직접 액세스 할 수 없습니다. 캡슐화는 내부 뷰에 중점을 둡니다. 다시 말해, 캡슐화는 다른 개체로부터 개체의 정보를 보호하는 데 사용되는 기술입니다.


3

추상화는 구현에 대한 세부 정보를 숨기고 있습니다.

당신은 행동을 수행하기 위해 아주 간단한 일을해야 할만큼 충분히 높은 지점으로 무언가를 추상화합니다.

정보 숨기기는 구현 세부 사항을 숨기고 있습니다. 프로그래밍이 어렵다. 다루고 처리해야 할 것들이 많이 있습니다. 매우 근접하게 추적하고 싶은 변수가있을 수 있습니다. 정보를 숨기면 공개적으로 노출 된 변수 나 방법을 사용하여 실수로 무언가를 부수는 일이 없습니다.

이 두 개념은 객체 지향 프로그래밍에서 매우 밀접하게 연결되어 있습니다.


3

추상화 -관련이없고 지루한 세부 사항을 포함하지 않고 물체의 필수 특성을 식별하는 프로세스입니다.

캡슐화 -데이터와이 데이터를 조작하는 기능을 단일 장치로 묶는 프로세스입니다.

추상화와 캡슐화는 관련이 있지만 보완적인 개념입니다.

  1. 추상화는 과정입니다. 캡슐화는 추상화가 구현되는 메커니즘입니다.

  2. 추상화는 객체의 관찰 가능한 동작에 중점을 둡니다. 캡슐화는이 동작을 일으키는 구현에 중점을 둡니다.

정보 숨기기 -개체의 구현 세부 정보를 숨기는 프로세스입니다. 캡슐화의 결과입니다.


2

캡슐화 : 데이터 멤버와 멤버 함수를 함께 바인딩하는 것을 캡슐화라고합니다. 캡슐화는 클래스를 통해 수행됩니다. 추상화 : 구현 세부 정보를 폼에서 사용하거나보기에서 숨기는 것을 추상화라고합니다. 예 : int x; 우리는 int가 어떻게 내부적으로 작동 할 지 모른다. 그러나 우리는 int가 작동한다는 것을 알고 있습니다. 그것은 추상화입니다.


2

추상화 : 추상화는 객체의 외부 관점을 식별하는 데 사용되는 개념 / 기술입니다. 필요한 인터페이스 만 사용 가능하게합니다.

정보 숨기기 : 정보 숨기기 를 통해 추상화가 이루어 지므로 추상화를 보완합니다. 외형 이외의 모든 것을 숨기고 있습니다.

캡슐화 : 데이터 및 관련 기능을 하나의 단위로 바인딩합니다. 추상화 및 정보 숨기기를 용이하게합니다. 추상화 및 정보 숨기기를 달성하기 위해 구성원 액세스와 같은 기능을 장치에 적용 할 수 있습니다.


2

유출 된 추상화의 법칙에 관한 Joel의 게시물을보십시오

JoelOnsoftware

기본적으로 추상화는 더 높은 수준의 개념을 자유롭게 생각할 수있게합니다. 비 프로그래밍 비유는 대부분의 사람들이 음식이 어디에서 왔는지 또는 어떻게 생산되는지 알지 못한다는 것입니다. 그러나 우리가 (보통) 걱정할 필요가 없다는 사실은 우리가 다른 것들을 할 수있게 해줍니다. 프로그램 작성.

정보 숨기기에 대해서는 잼에 동의합니다.


2

아주 짧게

캡슐화 : – 정보 숨기기

추출 : – 구현 숨기기

Abstractionwhat the object does캡슐화가 의미하는 동안 집중할 수 있습니다how an object works


1

추상화를 통해 복잡한 프로세스를 간단한 프로세스로 처리 할 수 ​​있습니다. 예를 들어, 표준 "파일"추상화는 파일을 연속 된 바이트 배열로 취급합니다. 사용자 / 개발자는 클러스터 및 조각화 문제에 대해 생각할 필요조차 없습니다. (추상은 일반적으로 클래스 또는 서브 루틴으로 나타납니다.)

정보 숨기기는 악의적이거나 무능한 사용자로부터 추상화를 보호하는 것입니다. 일부 상태 (예 : 하드 드라이브 할당)의 제어를 원래 개발자로 제한하면 엄청난 양의 오류 처리가 중복됩니다. 파일 시스템 드라이버 외에 다른 사람이 하드 드라이브에 쓸 수없는 경우 파일 시스템 드라이버는 하드 드라이브에 쓰여진 내용과 위치를 정확히 알고 있습니다. (이 개념의 일반적인 표현은 privateprotectedOO 언어의 키워드.)


1

무언가를 추상화하기 위해서는 세부 사항을 숨기거나 무언가의 세부 사항을 숨겨야합니다. 그러나 캡슐화를 통해 두 가지를 모두 달성 할 수 있습니다.

따라서 정보 숨기기는 목표이며 추상화는 프로세스이며 캡슐화는 기술입니다.


동일한 Java 예제를 제공 할 수 있습니까?
Chinmay

1

추상화는 단순히 소프트웨어의 필수 세부 사항 만 사용자에게 표시하여 사용자가 소프트웨어를 사용하거나 조작 할 수 있도록하는 기술을 의미하므로 해당 소프트웨어의 구현 세부 사항은 표시되지 않습니다 (보이지 않음). 캡슐화 는 하나 이상의 항목을 보유하고 따라서 일부 정보 (특히 프로그램 세부 사항)가 사용자에게 표시되고 일부가 보이지 않게하는 패키지를 보유한 기술이므로 정보 숨기기를 통해 캡슐화가 이루어집니다. 요약해서 말하자면. 추상화 는 (외부 적으로) 관찰 가능한 행동을위한 것이며 캡슐화는 (내부적으로) 보이지 않는 것을위한 것이지만이 두 가지는 실제로 보완 적입니다.


1

그냥 주위 자세한 내용에 추가 InformationHiding 발견 이 링크는 예제와 함께 정말 좋은 소스입니다

InformationHiding 은 의도하지 않은 결합을 방지하기 위해 설계 결정을 시스템의 나머지 부분에서 숨겨야한다는 아이디어입니다. 정보 숨기기는 설계 원칙입니다. 정보 숨김은 물건 을 캡슐화 하는 방법을 알려 주어야 하지만 물론 그럴 필요는 없습니다 .

캡슐화 는 프로그래밍 언어 기능입니다.


1

추상화와 캡슐화는 네 가지 기본 OOP 개념 중 두 가지로, 실제 사물을 객체로 모델링하여 프로그램과 코드에서 구현할 수 있습니다. 많은 초보자는 추상화와 캡슐화가 매우 비슷해 보이기 때문에 혼란스러워합니다. 누군가에게 추상화가 무엇인지 물어 보면 불필요한 세부 정보를 숨겨 관련 정보에 중점을 둔 OOP 개념이라고 말하고 캡슐화에 대해 요청할 때 많은 사람들이 외부 세계의 데이터를 숨기는 또 다른 OOP 개념이라고 말할 것입니다. 추상화와 캡슐화 모두 무언가를 숨기므로 정의가 잘못되지는 않았지만 주요 차이점은 의도입니다.

추상화는 좀 더 추상적 인 그림, 10,000 피트 정도의보기를 제공하여 복잡성을 숨기고 캡슐화는 내부 작업을 숨겨 나중에 나중에 변경할 수 있도록합니다. 즉, 추상화는 디자인 수준에서 세부 사항을 숨기고 캡슐화는 구현 수준에서 세부 사항을 숨 깁니다.


0

위의 모든 답변을 하나씩 읽은 후에는 내가 게시하는 것을 막을 수 없습니다.

추상화는 작업을 수행하고 상태를보고 및 변경하며 시스템의 다른 개체와 "통신"할 수있는 추상 "액터"를 나타내는 개체를 정의하는 기능을 포함합니다.

캡슐화는 위에서부터 분명합니다->

캡슐화라는 용어는 상태 세부 사항을 숨기는 것을 의미하지만 이전 프로그래밍 언어에서 데이터 유형의 개념을 확장하여 동작을 데이터와 가장 강력하게 연관시키고 다른 데이터 유형이 상호 작용하는 방식을 표준화하는 것이 추상화의 시작입니다.

참조 위키


0

나 역시 추상화와 캡슐화의 두 가지 개념에 대해 매우 혼란 스러웠다. 하지만 추상화 기사를 보았을 때 myjavatrainer.com 를 추상화 및 캡슐화가 사과와 오렌지라는 것이 분명해졌습니다. 둘 다 필요하기 때문에 실제로 비교할 수는 없습니다.

캡슐화는 객체가 생성되는 방식이며 추상화는 외부 세계에서 객체가 보는 방식입니다.


0

캡슐화 : 바인딩 데이터 및 그에 작용하는 메소드. 이를 통해 다른 클래스의 다른 모든 메소드에서 데이터를 숨길 수 있습니다. 예 : MyList, 항목을 추가 항목을 제거하고 모든 항목을 방법 제거 할 수 클래스 add, removeremoveAll외부에서 직접 액세스 할 수없는 목록에 관한 법률 (개인 배열).

추상화 : 관련성이없는 행동과 데이터를 숨기고 있습니다. 항목이 실제로 저장, 추가 또는 삭제되는 방식은 숨겨져 있습니다 (추상화). 내 데이터는 간단한 배열, ArrayList, LinkedList 등으로 유지 될 수 있습니다. 또한 메소드가 구현되는 방식은 외부에서 숨겨져 있습니다.


0

캡슐화-통제 된 방식으로 내부 데이터에 대한 액세스를 강화하거나 멤버가 직접 액세스하지 못하게합니다.

추상화-특정 메소드의 구현 세부 사항을 숨기는 것을 추상화라고합니다

예제의 도움으로 이해합시다.

class Rectangle
{
private int length;
private int breadth;// see the word private that means they cant be accesed from 
outside world.
 //now to make them accessed indirectly define getters and setters methods
void setLength(int length)
{  
// we are adding this condition to prevent users to make any irrelevent changes 
  that is why we have made length private so that they should be set according to 
   certain restrictions
if(length!=0)
{
 this.length=length
 }
void getLength()
{
 return length;
 }
 // same do for breadth
}

이제 추상화를 위해서만 액세스 할 수있는 메소드를 정의하고 사용자는 메소드의 본문이 무엇이고 어떻게 작동하는지 알지 못합니다. 위의 예를 고려하여 사각형의 영역을 계산하는 메소드 영역을 정의 할 수 있습니다.

 public int area()
 {
  return length*breadth;
 }

이제 사용자가 위의 방법을 사용할 때마다 계산 방법이 아닌 영역을 가져옵니다. 우리는 println () 메소드의 예를 고려할 수 있습니다. 우리는 그것이 인쇄에 사용된다는 것을 알고 있으며 데이터를 인쇄하는 방법을 모릅니다. 자세한 내용은 추상화와 캡슐화에 대한 아래 링크를 볼 수있는 블로그를 자세히 작성했습니다.


0

이 용어는 표준화 된 IEEE 정의를 가지고 있으며 https://pascal.computer.org/ 에서 검색 할 수 있습니다. .

추출

  1. 특정 목적과 관련된 정보에 초점을 맞추고 나머지 정보를 무시하는 객체보기
  2. 뷰를 공식화하는 과정
  3. 단순화 된 모델을 확립하기 위해 관련없는 세부 사항을 억제하는 프로세스 또는 해당 프로세스의 결과

정보 숨기기

  1. 각 모듈의 인터페이스가 모듈의 내부 작동에 대해 가능한 적은 정보를 공개하고 다른 모듈이 모듈의 인터페이스 사양에없는 모듈에 대한 정보를 사용하지 못하게하는 소프트웨어 개발 기술
  2. 결정이 다른 모듈에서 숨겨 지도록 단일 모듈에 설계 또는 구현 결정을 포함

캡슐화

  1. 시스템 기능 또는 일련의 데이터와 모듈 내 해당 데이터에 대한 작업을 분리하고 모듈에 대한 정확한 사양을 제공하는 소프트웨어 개발 기술
  2. 클래스의 책임의 이름, 의미 및 가치에 대한 접근은 그들의 실현에 대한 접근과 완전히 분리되어 있다는 개념
  3. 모듈은 내부와 구별되는 외부가 있고 외부 인터페이스와 내부 구현이 있다고 생각합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.