[oop] 연관성, 집계 및 구성의 차이점은 무엇입니까?

연관성, 집계 및 구성의 차이점은 무엇입니까? 구현 측면에서 설명하십시오.



답변

두 객체의 경우 FooBar의 관계를 정의 할 수 있습니다

연관성 -개체와 관계가 있습니다. Foo사용Bar

public class Foo {
    void Baz(Bar bar) {
    }
};

구성 -나는 물건을 소유하고 있으며 그 수명에 대한 책임이 있습니다. 때 Foo다이는, 그렇게Bar

public class Foo {
    private Bar bar = new Bar();
}

집계 -다른 사람에게서 빌린 물건이 있습니다. 때 Foo다이는 Bar살 수 있습니다.

public class Foo {
    private Bar bar;
    Foo(Bar bar) {
       this.bar = bar;
    }
}


답변

나는이 질문에 C #으로 태그가 붙어 있지만 개념은 리디렉션 과 같은 일반적인 질문 입니다. 그래서 여기에 내 관점을 제공 할 것입니다 (자바가 더 편한 자바 관점에서 약간 바이어스되었습니다).

우리는 객체 지향적 성격을 생각할 때 항상 객체, 클래스 (오브젝트 블루 프린트) 및 이들 간의 관계를 생각합니다. 객체는 방법을 통해 서로 관련되어 있으며 상호 작용합니다. 즉, 한 클래스의 객체는 다른 클래스의 객체가 제공하는 서비스 / 방법을 사용할 수있다. 이런 종류의 관계를 협회 라고합니다 . .

집계 및 구성은 연결의 하위 집합이므로 특정 연결 사례입니다.

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

  • 한 클래스의 집계 및 컴포지션 개체에서 다른 클래스의 “소유”개체 .
  • 그러나 미묘한 차이가 있습니다. 으로 구성 그것의 객체가 소유 클래스의 객체는 클래스를 소유하고있어 거기에 할 수있는 살 자신 있어요 (또한 소위 “죽음의 관계”). 집계 에서와 같이 종속 객체는 독립형 이며 소유 클래스의 객체가 죽은 경우에도 존재할 수 있는 소유 객체의 일부로 항상 존재합니다.
  • 따라서 컴포지션에서 소유 객체가 가비지 수집되면 소유 객체도 집계에 해당되지 않습니다.

혼란 스러운가?

구성 예 : 자동차 및 해당 자동차에 매우 특정한 엔진의 예를 고려하십시오 (즉, 다른 자동차에서는 사용할 수 없음). 자동차 간의 관계 유형SpecificEngine 클래스 Composition이라고합니다. Car 클래스의 개체는 SpecificEngine 클래스의 개체가 없으면 존재할 수 없으며 SpecificEngine의 개체는 Car 클래스가 없으면 의미가 없습니다. 간단히 말해서 Car 클래스는 SpecificEngine 클래스를 “소유”합니다.

집계 예 : 이제 Car 클래스와 Wheel 클래스를 고려하십시오 . 자동차가 작동하려면 Wheel 객체가 필요합니다. Car 객체는 Wheel 객체를 소유하지만 Car 객체가 없으면 Wheel 객체가 의미가 없다고 말할 수는 없습니다. 자전거, 트럭 또는 다른 자동차 개체에 매우 잘 사용될 수 있습니다.

요약하자면-

요약하자면 연관은 클래스가 다른 클래스에서 제공하는 기능을 사용할 때를 나타내는 데 사용되는 매우 일반적인 용어입니다. 우리는 하나의 부모 클래스 객체가 다른 자식 클래스 객체를 소유하고 그 자식 클래스 객체가 부모 클래스 객체없이 의미있게 존재할 수 없다면 구성이라고 말합니다. 가능하면 집계라고합니다.

자세한 내용은 여기를 참조하십시오.
나는 http://opensourceforgeeks.blogspot.in 의 저자이며 더 많은 컨텍스트를 위해 관련 게시물에 위의 링크를 추가했습니다.


답변

협회 는 관계의 일반화 된 개념입니다. 구성과 집계가 모두 포함됩니다.

컴포지션 ( 혼합 )은 간단한 객체 또는 데이터 유형을 단일 단위 로 래핑하는 방법입니다. 입니다. 컴포지션은 많은 기본 데이터 구조의 중요한 구성 요소입니다.

집계 ( 수집 )는 소유권을 의미하지 않는다는 점에서 일반적인 구성과 다릅니다. 컴포지션에서 소유 오브젝트가 파괴되면 포함 된 오브젝트도 파괴됩니다. 집계에서 이것은 반드시 사실이 아닙니다.

둘 다 대상 간의 관계를 나타내며 강도 만 다릅니다.

차이를 기억하는 트릭 :이 – ggregation 및 O WN – C O mpositoin을

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

이제 다음 이미지를 관찰하십시오

처지

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

유추:

구성 : 다음 그림은 이미지 구성입니다. 즉, 하나의 이미지를 만드는 개별 이미지를 사용합니다.
여기에 이미지 설명을 입력하십시오

집계 : 단일 위치에서 이미지 수집

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

예를 들어, 한 대학교는 다양한 부서를 소유하고 있으며 각 부서에는 여러 명의 교수가 있습니다. 대학이 문을 닫으면 해당 부서는 더 이상 존재하지 않지만 해당 부서의 교수는 계속 존재합니다. 따라서 대학은 부서 구성으로 볼 수있는 반면 부서에는 교수가 모여 있습니다. 또한 교수는 둘 이상의 부서에서 일할 수 있지만 부서는 둘 이상의 대학에 속할 수 없습니다.


답변

종속성 (참조)
두 개체 사이에 개념적 연결이 없음을 의미합니다. 예 : EnrollmentService 객체는 Student 및 Course 객체를 참조합니다 (메소드 매개 변수 또는 반환 유형).

public class EnrollmentService {
    public void enroll(Student s, Course c){}
}

연관성 (has-a)
그것은 거의 항상 객체들 (연관된) 사이에 연결이 있음을 의미합니다. 주문 오브젝트 고객 오브젝트가 있습니다

public class Order {
    private Customer customer
}

집계 ( 하스 + 전체 파트)
두 개체간에 전체 파트 관계가있는 특수한 종류의 연관입니다. 그들은 서로없이 살 수 있습니다.

public class PlayList{
    private List<Song> songs;
}

참고 : 가장 까다로운 부분은 일반 연관과 집계를 구별하는 것입니다. 솔직히 이것은 다른 해석에 개방적이라고 생각합니다.

컴포지션 (+ 전체 파트 + 소유권)
특수한 종류의 집계. 은 Apartment몇 가지로 구성되어있다 Room의. Room이 없으면 A 가 존재할 수 없습니다 Apartment. 아파트가 삭제되면 연결된 모든 객실도 삭제됩니다.

public class Apartment{
    private Room bedroom;
    public Apartment() {
       bedroom = new Room();
    }
}


답변

comp.object의 Robert Martin 의 게시물 에서 :

연관은 한 인스턴스가 다른 인스턴스로 메시지를 보내는 기능을 나타냅니다. 이는 메소드 인수 또는 로컬 변수 작성으로 구현 될 수도 있지만 일반적으로 포인터 또는 참조 인스턴스 변수로 구현됩니다.

//[Example:]

//|A|----------->|B|

class A
{
  private:
    B* itsB;
};

집계 […]는 일반적인 전체 / 부분 관계입니다. 이는 인스턴스가 순환 집계 관계를 가질 수 없다는 것 (즉, 일부가 전체를 포함 할 수 없음)을 제외하고는 연관과 정확히 동일합니다.

//[Example:]

//|Node|<>-------->|Node|

class Node
{
  private:
    vector<Node*> itsNodes;
};

이것이 집계라는 사실은 Node의 인스턴스가주기를 형성 할 수 없음을 의미합니다. 따라서 이것은 노드의 그래프가 아닌 노드의 트리입니다.

컴포지션 […]은 ‘부분’의 수명이 ‘전체’에 의해 제어된다는 점을 제외하면 집계와 정확히 같습니다. 이 제어는 직접적이거나 전이적일 수 있습니다. 즉, ‘전체’는 ‘파트’를 작성하거나 파기하는 데 직접적인 책임이 있거나 이미 작성된 파트를 승인 한 후 나중에 해당 파트를 책임지는 다른 전체에 전달할 수 있습니다.

//[Example:]

//|Car|<#>-------->|Carburetor|

class Car
{
  public:
    virtual ~Car() {delete itsCarb;}
  private:
    Carburetor* itsCarb
};


답변

다른 사람들이 말했듯이 연결은 개체 간의 관계이며 집계와 구성은 연결 유형입니다.

구현 관점에서 볼 때 클래스 멤버 를 참조 하여 집계를 얻습니다 . 예를 들어, 클래스 A가 클래스 B의 개체를 집계하면 다음과 같은 것이 있습니다 (C ++).

class A {
    B & element;
  // or B * element;
};

집계의 의미는 오브젝트 A가 소멸 될 때 오브젝트 B가 저장하는 B 오브젝트가 여전히 존재한다는 것입니다. 컴포지션을 사용할 때 일반적으로 멤버 를 값 별로 저장하면 더 강한 관계 가 있습니다 .

class A {
    B element;
};

여기에서 A 오브젝트가 파괴되면 포함 된 B 오브젝트도 파괴됩니다. 이를 달성하는 가장 쉬운 방법은 멤버를 값으로 저장하는 것입니다. 그러나 스마트 포인터를 사용하거나 소멸자에서 멤버를 삭제할 수도 있습니다.

class A {
    std::auto_ptr<B> element;
};

class A {
    B * element;

    ~A() {
        delete B;
    }
};

중요한 점은 컴포지션에서 컨테이너 객체가 포함 된 객체를 소유 하는 반면 집계에서는 컨테이너 객체를 참조 한다는 것입니다.


답변

세 가지 관계 개념 연관 , 집계구성 간의 구별에 대해 혼란이 얼마나 많은지 놀랍습니다 .

집계구성 이라는 용어 는 아마도 C ++ 커뮤니티 에서 UML 클래스 다이어그램에서 특수한 연관 사례로 정의되기 전에 한동안 사용되었습니다 .

주된 문제는 구성 개념이 전체 부품과 부품 사이의 수명주기 의존성을 암시하여 부품이 전체없이 존재할 수없고 부품이 존재하지 않는다는 사실을 무시한다는 광범위하고 지속적인 오해 (전문 소프트웨어 개발자들 사이에서도)입니다. 공유 할 수없는 부품과 부품이 분리되어 전체의 파괴에서 살아남을 수있는 부품 전체의 경우.

내가 볼 수있는 한,이 혼란은 두 가지 뿌리를 가지고 있습니다 :

  1. C ++ 커뮤니티에서 “집계”라는 용어 는 UML 클래스 다이어그램 의 연관 의미 인 다른 독립 클래스 (예 : [1] 참조)의 오브젝트를 참조하기위한 속성을 정의하는 클래스의 의미로 사용되었습니다 . “컴포지션”이라는 용어는 객체에 대한 구성 요소 객체를 정의하는 클래스에 사용되었습니다. 예를 들어 복합 객체가 파괴 될 때 이러한 구성 요소 객체도 파괴됩니다.

  2. UML 클래스 다이어그램에서 “집계”및 “구성”은 부분적으로 전체 관계를 나타내는 특수한 연관 사례로 정의되었습니다 (철학에서 오랫동안 논의되어 왔음). 정의에서 “집계”와 “구성”의 차이점은 둘 이상의 전체간에 부분을 공유 할 수 있는지에 따라 결정됩니다. “합성”은 공유 할 수없는 (독점) 파트를 갖는 것으로 정의하지만 “집계”는 파트를 공유 할 수 있습니다. 또한 다음과 같이 말합니다. 모든 경우에 있어서는 아니지만 컴포지션은 전체와 해당 파트 사이에 수명주기 종속성이있어서 파트가 전체 없이는 존재할 수 없습니다.

따라서 UML은 “전반적인 관계”라는 올바른 맥락에서 “집합”과 “구성”이라는 용어를 사용했지만 개발자의 직관을 포착하여 명확하고 모호하지 않은 방식으로 정의하지는 못했습니다. 그러나 이러한 관계가 가질 수있는 다양한 속성 (및 구현 뉘앙스)이 많고 개발자가이를 구현하는 방법에 동의하지 않기 때문에 이는 놀라운 일이 아닙니다.

또한 2009 년 4 월 SO 질문에 대한 확장 된 답변 을 참조하십시오 .

그리고 C ++ 커뮤니티에서 OOP 객체들 사이에 “구성”을 정의한다고 가정 한 속성 (그리고 이러한 믿음은 여전히 ​​널리 유지되고 있음) : 두 관련 객체들 (컴포지트와 그 구성 요소) 사이의 런타임 수명주기 의존성은 다음과 같습니다. 다른 유형의 연관에서도 참조 무결성으로 인해 이러한 종속성을 가질 수 있기 때문에 실제로는 “구성”의 특성이 아닙니다.

예를 들어 SO 구성에서 “composition”에 대한 다음 코드 패턴이 제안되었습니다 .

final class Car {
  private final Engine engine;

  Car(EngineSpecs specs) {
    engine = new Engine(specs);
  }

  void move() {
    engine.work();
  }
}

응답자는 다른 클래스가 컴포넌트를 참조 / 알 수없는 것이 “구성”의 특성이라고 주장했다. 그러나 이것은 가능한 모든 “조성”사례에 해당되는 것은 아닙니다. 특히, 자동차 엔진의 경우, 다른 클래스의 도움으로 구현 될 수있는 자동차 제조사는 문제가있을 때마다 자동차 소유자에게 연락 할 수 있도록 엔진을 참조해야 할 수도 있습니다.

[1] http://www.learncpp.com/cpp-tutorial/103-aggregation/

부록-StackOverflow의 구성과 집계에 대한 반복되는 질문의 불완전한 목록

[ 2009 년 4 월 ]
집계와 구성 [주로 의견 기반으로 마감]
[ 2009 년 4 월 ]
구성과 연관 관계의 차이점은 무엇입니까?
[ 2009 년 5 월 ]
연관, 집계 및 컴포지션 의 차이
[ 2009 년 5 월 ]
컴포지션과 집계의 차이점은 무엇입니까? [중복]
[ 2009 년 10 월 ]
집계, 구성 및 종속성의 차이점은 무엇입니까? [중복으로 표시]
[ 2010 년 11 월 ]
협회 대 집계 [중복으로 표시]
[2012 년 8 월 ]
Java에서 집계와 컴포지션의 구현 차이
[ 2015 년 2 월 ]
UML-연관 또는 집계 (간단한 코드 스 니펫)