캡슐화와 추상화의 차이점


87

오늘 인터뷰를 했어요. 캡슐화추상화 의 차이점에 대해 OOP 에서 질문을 받았습니다 .

나는 Encapsulation 이 기본적으로 데이터 멤버와 멤버 함수를 Class 라는 단일 단위로 바인딩 하는 것이라는 내 지식에 대해 그녀에게 대답했습니다 . 반면 추상화 및 구현의 숨기기 복잡성 기본적으로 사용자에 대한 접근의 용이성 제공합니다. 나는 그녀가 내 대답에 괜찮을 것이라고 생각했습니다. 그러나 그녀는 두 가지의 목적이 정보를 숨기는 것이라면이 둘의 실제 차이점은 무엇입니까? 나는 그녀에게 어떤 대답도 할 수 없었다.

이 질문을하기 전에이 두 OOP 개념 의 차이점에 대해 StackOverFlow의 다른 스레드를 읽었습니다 . 그러나 나는 면접관을 설득 할 수있는 위치에 있지 않다.

누구든지 가장 간단한 예를 들어 정당화 할 수 있습니까?


13
그리고 마침내 직업을 얻었습니까? :)
Adrian Księżarczyk 2013 년

1
@WPFbee 죄송합니다!
Aimal Khan

3
사람들이 추상화와 캡슐화를 비교하는 이유를 모르겠습니다. 두 가지 다른 OOP 개념으로 받아 들일 수없는 이유는 무엇입니까?
미스터 ASquare


@WpfBee 추상화가 숨어와는 아무 상관이없는, 그냥 내 대답 체크 아웃
S와 Vinesh을

답변:


74

Encapsulate 는 외부인이 직접 액세스하지 못하도록 클래스에서 자주 변경 될 수있는 변수 또는 일부 구현을 숨 깁니다 . getter 및 setter 메서드를 통해 액세스해야합니다.

추상화 는 무언가를 숨기는데도 사용되지만 더 높은 수준 (class, interface)에서 사용 됩니다. 클라이언트는 추상 클래스 (또는 인터페이스)를 사용합니다. 누구이거나 누구 였는지 신경 쓰지 않고 무엇을 할 수 있는지 알면됩니다.


7
완전한. 귀하의 대답은 면접관 질문을 대상으로 한 것 같습니다. 실용적인 예를 들어 귀하의 답변을 다시 반복하려고합니다. 귀하의 회신이 정당한 경우 알려주십시오. 텔레비전의 예를 들어 보겠습니다. 캡슐화는 TV를 만들기 위해 결합되는 내부 회로, LED 등입니다. 추상화는 on-off, 사운드, 채널 설정 및 작동을 위해 제공되는 기타 버튼입니다.
WpfBee 2013 년

Guys abstraction은 구현을 숨기는 것과는 아무 관련이 없습니다. 추상화는 클래스와 다형성으로 상호 작용하는 방법입니다
Mortalus

1
@Mortalus- "추상화는 구현을 숨기는 것과 관련이 없습니다"라는 첫 번째 진술에 동의하지 않습니다. 추상화 개념을 배우기 시작할 때 가장 먼저 배운 것은 구현의 복잡성을 숨기고이를 사용하기 위해 사용자에게 인터페이스를 제공한다는 것입니다. 사용자가 구현 복잡성에 관심이 없을 수 있기 때문입니다. TV 또는 AC의 실용적인 예를 들어 볼 수 있습니다. 또 다른 것은 구현을 숨기지 않으면 본문이없는 추상 클래스에 메서드를 제공하는 이유입니다. 우리는 여기서 구현을 분명히 숨기고 있습니다.
WpfBee 2013 년

1
@Mortalus-또한 위키 링크를 언급했습니다. 첫 번째 진술입니다. "컴퓨터 과학에서 추상화는 데이터와 프로그램이 그 의미 (의미론)와 유사한 형태로 정의되고 구현 세부 사항을 숨기는 과정입니다. 추상화는 세부 사항을 줄이고 제거하려고합니다. 프로그래머는 한 번에 몇 가지 개념에 집중할 수 있습니다. " 그 자체는 추상화가 구현을 숨기기위한 것임을 암시합니다. 귀하의 두 번째 진술에는 동의하지만 첫 번째 진술에는 동의하지 않습니다.
WpfBee 2013 년

1
캡슐화는 하나의 유닛을 만드는 것에 더 가깝다고 생각합니다. 숨기거나 말거나하는 것이 아닙니다. 추상화가 사물을 숨기는 것에 더 가깝기 때문에 내가 틀렸다면 수정하십시오.
raj240


12

추상화-객체 세트에 대한 공통 필수 특성을 식별하는 프로세스 (및이 프로세스의 결과)입니다. 추상화는 일반화의 과정이라고 말할 수 있습니다. 고려중인 모든 객체는 객체의 상위 집합에 포함되며, 모든 객체는 주어진 속성을 가지고 있지만 다른 측면에서는 다릅니다.

캡슐화-외부 세계로부터 내부 구현을 숨기기 위해이 데이터를 단일 단위로 조작하는 데이터와 함수를 묶는 프로세스입니다.

이것은 (질문과 마찬가지로) 특정 프로그래밍 언어와 관련이없는 일반적인 답변입니다. 그래서 대답은 : 추상화와 캡슐화는 공통점이 없습니다. 그러나 구현은 서로 관련 될 수 있습니다 (예 : Java에서 : 캡슐화-세부 사항은 클래스에 숨겨져 있고 추상화-세부 사항은 클래스 또는 인터페이스에 전혀 표시되지 않음).


11

캡슐화 : 코드와 데이터를 하나의 단위로 묶습니다. Class메서드와 속성을 래핑하기 때문에 캡슐화의 예입니다.

추상화 : 내부 세부 정보를 숨기고 기능 만 표시합니다. 추상화는 객체가 수행하는 방식 대신 객체가 수행하는 작업에 중점을 둡니다. 일반화 된 클래스보기를 제공합니다.

int number = 5;
string aStringNumber = number.ToString(); 

여기서 ToString ()은 추상화입니다. 그리고이 메커니즘 number변수가 문자열로 변환되고 초기화되는 방법aStringNumber 은 캡슐화입니다.

계산기의 실제 사례를 살펴 보겠습니다. 캡슐화는 내부 회로, 배터리 등을 결합하여 계산기로 만듭니다. 추상화는 on-off, clear 및 작동을 위해 제공되는 기타 버튼과 같은 다른 버튼입니다.


7

추상화 : 일반적으로 클래스 집합에 대한 다형성 액세스를 제공하기 위해 수행됩니다. 추상 클래스는 인스턴스화 될 수 없으므로보다 구체적인 표현을 만들기 위해 다른 클래스가 파생되어야합니다.

추상 클래스의 일반적인 사용 예는 콘크리트 클래스가 자체 "구체적"방식으로 구현할 수 있도록 추상 주입 지점이 도입되는 템플릿 메서드 디자인 패턴의 구현 일 수 있습니다.

참조 : http://en.wikipedia.org/wiki/Abstraction_(computer_science)

캡슐화 : 특정 클래스의 구현 복잡성을 사용할 클라이언트로부터 숨기는 프로세스입니다. "클라이언트"는 클래스를 작성한 사람이 프로그램이나 이벤트 일 수 있음을 명심하십시오.

참조 : http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)


1
추상화는 추상 클래스와 관련이 있습니까 ??
vishnu viswanath 2014

@vishnuviswanath, 예, 추상 클래스와 인터페이스를 사용하여 추상화를 구현할 수 있습니다.
invzbl3 dec.

3

추상화, 캡슐화 및 정보 숨김의 차이점에 대한 훌륭한 기사가 있습니다. http://www.tonymarston.co.uk/php-mysql/abstraction.txt

이 기사의 결론은 다음과 같습니다.

추상화, 정보 숨김 및 캡슐화는 매우 다르지만 관련성이 높은 개념입니다. 추상화는 어떤 특정 정보를 표시해야하고 어떤 정보를 숨겨야하는지 식별하는 데 도움이되는 기술이라고 주장 할 수 있습니다. 캡슐화는 숨겨야 할 내용을 숨기고 표시 할 내용을 표시하는 방식으로 정보를 패키징하는 기술입니다.


2

둘 다의 차이점은 클라이언트가 로직의 내부보기를 보지 못하도록하는 것이 목표 인 경우 데이터를 숨기는 데 뷰 포인트
캡슐화 단어가 사용된다는 것입니다.

추상화 단어는 우리의 목표가 고객에게 외부 뷰를 보여주는 것이라면 데이터를 숨기는 데 사용됩니다.

외부보기는

BubbleSort(){
//code 
swap(x,y);
}

여기에서는 우리가 적용하는 로직을 클라이언트에게 보여주기 위해 버블 정렬에서 스왑을 사용합니다. 여기서 swap (x, y)를 전체 코드로 대체하면 단일 인스턴스에서 로직을 이해할 수 없습니다.


2

예, 추상화와 캡슐화가 숨어 있다는 것은 사실입니다.

  • 관련 세부 사항 만 사용하고 디자인 수준 에서 불필요한 데이터를 숨기는 것을 추상화 라고 합니다. (더 추상적이거나 일반적으로 만들기 위해 'Car'클래스에 대한 관련 속성 만 선택하는 것과 같습니다.)

  • 캡슐화구현 수준 에서 데이터를 숨기는 것입니다 . 직접 / 외부 액세스로부터 데이터를 실제로 숨기는 방법과 같습니다. 이는 외부 액세스를 방지하기 위해 데이터와 메소드를 단일 엔티티 / 유닛에 바인딩함으로써 수행됩니다. 따라서 캡슐화는 구현 수준에서 데이터 숨김이라고도합니다.


3
이 답변이 기존의 다른 12 개 답변과 어떻게 다른지 설명해 주시겠습니까?
스티븐 라우 흐

2

캡슐화 :

약 캡슐과 같은 것을 숨기고 있습니다. 우리는 캡슐에 무엇이 있는지 모르고 그냥 가져갑니다. 프로그래밍과 동일-메소드 또는 속성의 특수 코드를 숨기고 캡슐과 동일한 출력 만 제공합니다. 간단히 말해서 캡슐화는 데이터를 숨 깁니다.

추출:

추상화는 논리 또는 구현을 숨기는 것을 의미합니다. 예를 들어, 우리는 정제를 복용하고 그 색깔을 보지만 이것의 목적이 무엇인지, 그리고 그것이 신체와 어떻게 작용하는지 모릅니다.


0

추출

Java에서 추상화는 정보를 실제 세계에 숨기는 것을 의미합니다. “서비스를 이용하기 위해 무엇을해야하는지”를 알리기 위해 당사자 간의 계약을 성립합니다.

예, API 개발에서는 실제 구현이 아닌 추상화 된 서비스 정보 만 세상에 공개되었습니다. Java의 인터페이스는이 개념을 매우 잘 달성하는 데 도움이 될 수 있습니다.

인터페이스는 당사자 (예 : 생산자와 소비자) 간의 계약을 제공합니다. 생산자는 제품이 어떻게 만들어 지는지 소비자에게 알리지 않고 제품을 생산합니다. 그러나 인터페이스를 통해 Producer는 모든 소비자에게 어떤 제품을 구매할 수 있는지 알려줍니다. 추상화의 도움으로 생산자는 소비자에게 제품을 판매 할 수 있습니다.

캡슐화 :

캡슐화는 추상화의 한 수준 아래입니다. 같은 제품 회사가 서로 생산 그룹의 정보를 보호하려고합니다. 예를 들어, 회사에서 와인과 초콜릿을 생산하는 경우 캡슐화는 각 제품이 서로 어떻게 만들어 지는지 정보를 보호하는 데 도움이됩니다.

  1. 개별 패키지 하나는 와인 용이고 다른 하나는 초콜릿 용이고 패키지에서 모든 클래스가 기본 액세스 수정 자로 선언되면 모든 클래스에 대해 패키지 수준 캡슐화를 제공합니다.
  2. 패키지 내에서 파일 된 각 클래스 (멤버 필드)를 개인으로 선언하고 해당 필드에 액세스 할 수있는 공용 메서드를 갖는 경우 이러한 방법으로 해당 필드에 클래스 수준 캡슐화를 제공합니다.

0

명확하게하기 위해 몇 가지만 더 말씀 드리겠습니다.

데이터 추상화와 추상 클래스를 혼동해서는 안됩니다. 그들은 달라.

일반적으로 추상 클래스 또는 메서드는 기본적으로 무언가를 숨기는 것이라고 말합니다. 하지만 아니 .. 그건 틀렸어. 추상이라는 단어는 무엇을 의미합니까? Google 검색에 따르면 영어 단어 추상화는

"생각이나 아이디어로 존재하지만 물리적 또는 구체적인 존재는 없습니다."

추상 클래스의 경우에도 마찬가지입니다. 방법의 내용을 숨기지 않지만 방법의 내용은 이미 비어 있지만 (물리적이거나 구체적인 존재가 없음) 방법이 (생각에 또는 아이디어로 존재) 또는 방법이 calss에 있어야하는 방법을 결정합니다. .

그렇다면 실제로 추상적 인 방법을 언제 사용합니까?

  • 기본 클래스의 메서드가이를 확장하는 각 자식 클래스에서 다를 때.
  • 따라서 자식 클래스에이 함수가 구현되어 있는지 확인해야합니다.
  • 이것은 또한 메소드가 필수 서명을 가지려면 n 개의 매개 변수를 가져야합니다.

그래서 추상 클래스에 대해! -추상 클래스는 인스턴스화 할 수 없으며 확장 만 가능합니다! 하지만 왜?

  • 추상 메서드가있는 클래스는 그 안에있는 추상 메서드가 의미있는 구현이 없기 때문에 자체 인스턴스를 만들지 못하도록해야합니다.
  • 어떤 이유로 해당 클래스의 인스턴스를 갖는 것이 의미가 적다는 것을 알면 클래스 추상을 만들 수도 있습니다.

Abstract 클래스는 새로운 인스턴스를 생성하지 않도록 도와줍니다!

클래스의 추상 메서드는 자식 클래스가 제공된 서명으로 해당 함수를 확실히 구현하도록합니다!


0

위에서 설명한 동일한 예를 사용하여 설명하겠습니다. 친절하게 같은 TV를 고려하십시오.

캡슐화 : 리모컨으로 할 수있는 조정은 좋은 예입니다-볼륨 UP / DOWN, 색상 및 대비-우리가 할 수있는 것은 제공된 최소값과 최대 값으로 조정하는 것 뿐이며 리모컨에서 제공하는 것 이상으로는 아무것도 할 수 없습니다- 여기에 게터와 세터를 상상해보십시오 (예인 경우 제공된 값이 유효한지 세터 함수가 확인합니다. 변경을 허용하지 않으면 작업을 처리합니다. 볼륨을 낮추더라도 볼륨을 0 이상으로 줄일 수 없습니다. 버튼을 백 번).

추상화 : 여기서는 동일한 예를 사용할 수 있지만 더 높은 학위 / 컨텍스트를 사용합니다. 볼륨 낮추기 버튼은 볼륨을 줄입니다. 이것은 우리가 사용자에게 제공하는 정보이며 사용자는 리모컨 내부의 적외선 송신기 나 TV의 수신기, 신호 및 마이크로 프로세서를 파싱하는 후속 프로세스를 인식하지 못합니다. TV 내부의 건축. 간단히 말해서 컨텍스트에서 필요하지 않습니다. 필요한 것을 제공하십시오. 여기에서 교과서 정의를 쉽게 연관시킬 수 있습니다. 즉, 내부 구현을 숨기고 수행하는 방법보다는 수행 할 작업 만 제공하는 것입니다!

조금 명확 해지기를 바랍니다!


0

인터뷰에 응한 사람이라면 최종 사용자 관점의 추상화와 캡슐화가 상당히 같다고 말할 수 있습니다. 정보를 숨기는 것입니다. 소프트웨어 개발자 관점에서 Abstraction은 디자인 수준에서 문제를 해결하고 Encapsulation은 구현 수준에서 문제를 해결합니다.


0

간단히 말해, Abstraction구현을 숨기고 클래스의 인스턴스와 상호 작용할 수있는 인터페이스를 구현하여 클래스 수준에서 발생합니다. 반면 Encapsulation정보를 숨기는 데 사용됩니다. 예를 들어, 멤버 변수를 비공개로 설정하여 직접 액세스를 금지하고 이들에 대한 getter 및 setter를 제공하여 명시 적 액세스를 제공합니다.


0

예 !!!! 캡슐화가 일종의 고급 특정 범위 추상화 라고 말하면 ,

얼마나 많은 사람들이 내 대답을 읽거나 찬성했습니다. 내가 왜 이렇게 말하는지 파헤쳐 보자.

청구하기 전에 두 가지 사항을 확인해야합니다.

하나는 데이터 숨김이고 다른 하나는 추상화입니다.

데이터 숨김

대부분의 경우 내부 데이터에 대한 직접 액세스 권한을 부여하지 않습니다. 외부인이 내부 데이터에 직접 액세스 할 수없는 내부 데이터는 직접 내보내서는 안됩니다. 특정 개체의 내부 상태를 보호해야하기 때문에 보안에 관한 것입니다.


추출

단순화를 위해 내부 구현 숨기기를 추상화라고합니다. 추상화에서 우리는 필요한 것들에만 집중합니다. 기본적으로 우리는 추상화에서 "How to do"가 아니라 "What to do"에 대해 이야기합니다. 보안은 또한 "우리가 구현하는 방법"을 강조하지 않기 때문에 추상화를 통해 달성 할 수 있습니다. 구현을 변경할 수 있기 때문에 유지 관리가 향상되지만 최종 사용자에게는 영향을 미치지 않습니다.


저는 "캡슐화는 일종의 고급 특정 범위 추상화입니다"라고 말했습니다. 왜? 캡슐화를 데이터 숨김 + 추상화로 볼 수 있기 때문에

캡슐화 = 데이터 숨김 + 추상화

캡슐화에서는 외부인이 데이터를 볼 수 없도록 데이터를 숨겨야하며 데이터에 액세스하는 데 사용할 수있는 방법을 제공해야합니다. 이러한 메서드에는 외부 사람에게도 숨겨진 해당 항목 내부에 유효성 검사 또는 기타 기능이있을 수 있습니다. 그래서 여기서 우리는 접근 방법의 구현을 숨기고 있는데 이것을 추상화라고합니다.

이것이 제가 위와 같이 캡슐화가 일종의 추상화라고 말한 이유입니다.

그렇다면 차이점은 무엇입니까?

차이점은 단순성, 유지 보수성 및 보안을 위해 사용자로부터 무언가를 숨기는 경우 추상화가 일반적인 것입니다.

캡슐화는 내부 상태 (데이터 숨김)를 숨기고있는 내부 상태 보안과 관련된 특정 것이며, 데이터에 액세스 할 수있는 방법과 외부 사람 (추상화)에게도 숨겨진 방법 구현을 제공하고 있습니다.


-2

추상화 : 클래스 외부에 노출되어야하는 최소 함수와 변수는 무엇입니까?

캡슐화 :이 요구 사항을 달성하는 방법, 즉 구현 방법.


캡슐화는 추상화를 달성하는 수단이 아닙니다. 두 가지 개념이 약간 다르지만 미묘한 링크가 있습니다.
varsh

둘 다 다른 개념이 아니라고 생각합니다. 추상 클래스로 캡슐화를 달성 할 수 있습니다.
K Kishore Kumar Reddy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.