[oop] 추상화와 캡슐화의 차이점은 무엇입니까?

캡슐화와 추상화의 정확한 차이점은 무엇입니까?



답변

여기서 대부분의 답변은 OOP에 중점을두고 있지만 캡슐화는 훨씬 일찍 시작됩니다.

  • 모든 기능은 캡슐화입니다 . 의사 코드에서 :

    point x = { 1, 4 }
    point y = { 23, 42 }
    
    numeric d = distance(x, y)
    

    여기서는 distance평면에서 두 점 사이의 (유클리드) 거리 계산을 캡슐화합니다. 구현 세부 정보를 숨 깁니다. 이것은 순수하고 간단한 캡슐화입니다.

  • 추상화일반화 프로세스입니다 . 구체적으로 구현하고 다소 관련이 있지만 다른 유형의 데이터에 적용 할 수 있습니다. 추상화의 전형적인 예는qsort데이터를 정렬하는C의함수입니다.

    중요한 것은 qsort정렬하는 데이터에 신경 쓰지 않고 실제로 어떤 데이터를 정렬하는지 알지 못한다는 것입니다. 오히려 입력 유형은 유형이없는 포인터 ( void*)이며 C의 방식으로 “데이터 유형에 신경 쓰지 않습니다”라고 말합니다 (이 유형은 유형 지우기라고도 함). 중요한 점은 구현 qsort이 데이터 유형에 관계없이 항상 동일하게 유지 된다는 것입니다 . 유일하게 갖는다 변화는 다르다 데이터 유형에서 데이터 유형으로 비교 기능이다. qsort따라서, 사용자는 상기 비교 함수를 함수 인수로서 제공 할 것을 기대한다.

캡슐화와 추상화는 너무나 밀접한 관계가 있기 때문에 실제로 분리 할 수없는 지점을 만들 수 있습니다. 실제적인 목적으로 이것은 아마도 사실 일 것입니다. 즉, 추상화가 많지 않은 캡슐화가 있습니다.

class point {
    numeric x
    numeric y
}

우리는 점의 좌표를 캡슐화하지만 논리적으로 그룹화하는 것 이상으로 실질적으로 추상화하지는 않습니다.

캡슐화되지 않은 추상화의 예는 다음과 같습니다.

T pi<T> = 3.1415926535

이것은 주어진 값 (π)을 가진 일반 변수 pi 이며 선언은 변수의 정확한 유형에 신경 쓰지 않습니다. 분명히, 나는 실제 코드에서 이와 같은 것을 찾기가 어려울 것입니다 : 추상화는 사실상 항상 캡슐화를 사용합니다. 그러나, 위에서 언급 않는 사실로, C ++ (14)에 존재하는 가변 템플릿 (= 변수 일반적인 템플릿); 약간 더 복잡한 구문으로 예를 들면 다음과 같습니다.

template <typename T> constexpr T pi = T{3.1415926535};


답변

캡슐화 에서 일반 또는 특수 동작에 대한 구현 세부 정보가 숨겨져 있습니다.

추상화 는 일반화를 제공합니다 (예 : 일련의 동작).

여기에 좋은 읽기는 다음과 같습니다 추상화, 캡슐화, 정보 숨기기 개체 기관의 에드워드 V. 베라 르로는.


답변

많은 답변과 그 예가 오도됩니다.

캡슐화 는 해당 데이터 에서 작동하는 데이터기능을 단일 구성 요소로 묶고 일부 객체 구성 요소에 대한 액세스를 제한합니다.
캡슐화는 객체의 내부 표현이 일반적으로 객체 정의 외부의보기에서 숨겨져 있음을 의미합니다.

추상화 는 구현 세부 사항을 포함하지 않고 필수 기능을 나타내는 메커니즘입니다.

캡슐화 :정보 숨기기 .
추상화 :구현 숨기기 .

예:

class foo{
    private:
        int a, b;
    public:
        foo(int x=0, int y=0): a(x), b(y) {}

        int add(){
            return a+b;
        }
}

foo클래스 객체의 내부 표현은 클래스 외부에 숨겨져 있습니다. -> 캡슐화.
개체의 액세스 가능한 멤버 (데이터 / 기능) foo는 제한되어 있으며 해당 개체 만 액세스 할 수 있습니다.

foo foo_obj(3, 4);
int sum = foo_obj.add();

방법의 구현 add은 숨겨져 있습니다. -> 추상화.


답변

캡슐화는 상자에 물건을 넣고 들여다 보는 구멍을 제공합니다. 이렇게하면 기어를 사용하지 않아도됩니다.

추상화 플랫 아웃은 기어, 래칫, 플라이휠 또는 핵 코어가 있는지 여부와 같이 중요하지 않은 세부 사항을 무시합니다. 그들은 단지 “가”

캡슐화의 예 :

  • 팬티
  • 공구 상자
  • 지갑
  • 핸드백
  • 캡슐
  • 냉동 탄산염
  • 버튼이 있거나없는 상자
  • 부리 토 (기술적으로 부리 토 주변의 옥수수)

추상화의 예 :

  • “사물 그룹”은 추상화 (우리는 집계라고 함)
  • “다른 것들을 포함하는 것들”은 추상화 (우리가 작곡이라고 부릅니다)
  • “컨테이너”는 또 다른 종류의 “다른 것들을 포함하는 것들”추상화입니다. 모든 캡슐화 예는 용기의 종류이지만 모든 용기가 캡슐화를 나타내거나 제공하는 것은 아니다. 예를 들어 바구니는 내용물을 캡슐화하지 않는 용기입니다.

답변

캡슐화 는 getter 및 setter 등을 사용하는 것과 같은 데이터 숨기기를 의미합니다.

추상화는 추상 클래스 및 인터페이스 등을 사용하여 구현을 숨기는 것을 의미합니다.


답변

추상화는 일반화 된 용어입니다. 즉, 캡슐화는 추상화의 하위 집합입니다.

여기에 이미지 설명을 입력하십시오

  • 예 2 : 솔루션 아키텍트는 높은 수준 만드는 사람 추상적 인 전체 솔루션의 기술적 인 디자인,이 디자인은 다음하여 넘겨되어 개발 팀 을 위해 구현 .

    여기서 솔루션 아키텍트는 추상적 인 역할을하고 개발 팀은 캡슐화 역할을합니다.

  • 예 3 : 사용자 데이터의 캡슐화 (네트워킹)

여기에 이미지 설명을 입력하십시오

예의

추상화 (또는 모듈화) – 유형을 사용하면 프로그래머가 비트 또는 바이트보다 높은 수준에서 생각할 수 있으며 낮은 수준의 구현에는 신경 쓰지 않습니다. 예를 들어, 프로그래머는 문자열을 단순한 바이트 배열 대신 문자 값 세트로 생각하기 시작할 수 있습니다. 더 높은 유형의 프로그래머는 프로그래머가 두 가지 크기의 하위 시스템 간의 인터페이스를 생각하고 표현할 수 있습니다. 이는 더 많은 레벨의 지역화를 가능하게하여 서브 시스템의 상호 운용성에 필요한 정의가 두 서브 시스템이 통신 할 때 일관성을 유지하도록합니다.
출처


답변

많은 좋은 답변이 위에 제공되었지만 여기에 내 (Java) 관점을 제시하려고합니다.

데이터 캡슐화는 단순히 클래스에서 논리적으로 그룹화 된 데이터의 액세스를 래핑하고 제어하는 ​​것을 의미합니다. 일반적으로 다른 키워드 인 데이터 숨기기 와 연결됩니다 . 이것은 액세스 수정자를 사용하여 Java에서 수행됩니다 .

간단한 예는 전용 변수를 정의하고 getter 및 setter 메소드를 사용하여 액세스하거나 클래스를 사용하는 것만으로 전용 메소드를 만드는 것입니다. 사용자가 이러한 방법과 변수에 대해 알 필요가 없습니다.

참고 : 캡슐화가 모든 데이터 숨기기에 관한 것임을 오해해서는 안됩니다. 캡슐화라고 할 때 관련 데이터와 동작을 그룹화하거나 패키징 또는 번들링해야합니다.

반면에 데이터 추상화 는 복잡한 논리 아래에 사용자에게 노출되지 않도록 일반화하는 개념입니다. Java에서는 인터페이스추상 클래스를 사용하여이 작업을 수행합니다 .

예 –

우리는이 말을하자 인터페이스 동물을 하고 함수가 makeSound ()을 . 이 인터페이스를 구현하는 두 개의 구체적인 클래스 인 DogCat 이 있습니다. 이 구체적인 클래스에는 makeSound () 함수의 개별 구현이 있습니다. 이제 동물을 가지고 있다고 가정 해 봅시다 (우리는 이것을 외부 모듈에서 얻습니다). 모든 사용자가 수신하는 대상은 일부 동물이며 동물 소리를 인쇄하는 것은 사용자의 책임입니다. 무차별 대입 방법 중 하나는 수신 한 객체를 확인하여 해당 유형 을 식별 한 다음 해당 Animal 유형으로 타입 캐스트 한 다음 makeSound () 를 호출 하는 것입니다. 그러나 더 깔끔한 방법은 사물추상화하는 것 입니다. 동물을다형성 참조 및 그것에 makeSound ()를 호출하십시오. 에서 런타임 실제 개체 유형이 적절한 기능을 호출됩니다 무엇에 따라 달라집니다.

자세한 내용은 여기를 참조 하십시오 .

여기에 이미지 설명을 입력하십시오

복잡한 로직은 터치 패드에 캡슐화 된 회로 보드에 있으며 사용자에게이를 추상화하기 위해 멋진 인터페이스 (버튼)가 제공됩니다.

추신 : 위의 링크는 내 개인 블로그로 연결됩니다.