집계 대 구성


206

OOP의 구성이 무엇인지 이해하지만 집계가 무엇인지에 대한 명확한 아이디어를 얻을 수 없습니다. 누군가 설명 할 수 있습니까?

답변:


322

간단한 규칙 :

  1. A "소유자"B = 구성 : B는 A가없는 시스템에서 의미 나 목적이 없습니다.
  2. A "사용"B = 집계 : B는 A와 독립적으로 (개념적으로) 존재합니다.

예 1 :

회사는 사람들의 집합입니다. 회사는 계정 구성입니다. 회사가 사업을 중단하면 해당 계정은 존재하지 않지만 직원은 계속 존재합니다.

예 2 : (매우 단순화)

텍스트 편집기는 버퍼 (구성)를 소유합니다. 텍스트 편집기는 파일 (집계)을 사용합니다. 텍스트 편집기가 닫히면 버퍼는 파괴되지만 파일 자체는 파괴되지 않습니다.


11
자동차는 부품의 집합체입니까?
reinierpost

2
그리고 두 종류의 엔티티 사이의 집계는 다른 관계와 어떻게 다릅니 까?
reinierpost

55
@reinierpost 실제로 자동차는 부품의 집합이며 부품은 단순히 분자의 집합입니다. 그러나 모델 에서는 모두 요구 사항에 따라 다릅니다. 자동차와 무관하게 수명을 추적 할 수 있도록 엔진을 별도의 개체로 취급해야합니까? 다른 차에서 똑같은 엔진을 재사용 할 수 있습니까? 그렇다면 아마도 집계를 원할 것입니다. 그렇지 않으면 자동차의 일부가 아닌 엔진을 신경 쓰지 않고 엔진 재사용을 신경 쓰지 않기 때문에 구성을 원합니다.
Curtis Batt

3
누락 된 것은 완전한 이해를위한 구현 예제입니다.
Chesnokov Yuriy

1
회사가 사업을 중단 할 때 직원은 어떻습니까? 직원과 사람이 다른 존재입니까? 회사가 직원 구성이라고 말할 수 있습니까?
arjun

36

에서 http://en.wikipedia.org/wiki/Object_composition

집계는 소유권을 의미하지 않는다는 점에서 일반적인 구성과 다릅니다. 컴포지션에서 소유 오브젝트가 파괴되면 포함 된 오브젝트도 파괴됩니다. 집계에서 이것은 반드시 사실이 아닙니다. 예를 들어, 대학에는 다양한 부서 (예 : 화학)가 있으며 각 부서에는 여러 명의 교수가 있습니다. 대학이 문을 닫으면 해당 부서는 더 이상 존재하지 않지만 해당 부서의 교수는 계속 존재합니다. 따라서 대학은 부서 구성으로 볼 수 있지만 부서에는 교수가 모여 있습니다. 또한 교수는 둘 이상의 부서에서 일할 수 있지만 부서는 둘 이상의 대학에 속할 수 없습니다.

따라서 컴포지션과의 소유권 관계가 있지만 소유자가있는 경우 소유 한 개체도 소멸됩니다. 집계 (및 포함 된 개체)는 독립적으로 존재할 수 있습니다.

-

업데이트 : 사과-이 답변은 뒤늦게 너무 단순합니다.

c.batt는 그의 답변에서 우수한 정의를 제공합니다. 집계 vs 구성


3
이 예에서는 컴포지션이 일대 다이고 인용에 일대 다 관계가 있음을 인용하지만 여기서는 집계에 대한 다 대다 관계가 될 수도 있습니다 (우리는 가능한 것으로 가정 할 수 있음) 교사는 여러 부서에서 가르 칠 수 있습니다). 한 부서는 여러 대학에 속할 수 없습니다. 구성은 소유권을 의미하지만 집계는 관계를 넘어서는 안됩니다. 인용문은 정확하지만 주석은 정확하지 않습니다.
Newtopian

1
그것은 파괴와 아무 상관이 없습니다! UML은 가비지 수집 시스템을 정의하지 않습니다.
표시 이름

2
나는 wikipedia 링크가 반사적 인 공감대를 얻고 있다고 생각하지만, 이것은 끔찍한 정의입니다-@bold는 이러한 관계가 GC와 관련이 없다는 것을 지적했습니다. 물체가 두 개의 인공 팔다리를 연결하는 볼 조인트의 공과 같은 다른 두 가지 물체의 구성 요소 인 경우에도 마찬가지입니다. 컴포넌트 관계는 기능 의존성에 관한 것입니다.
Steven A. Lowe

1
나는 나의 대답이 심각하게 부족하다는 것에 동의하지만 WikiPedia 기사도 마찬가지입니다.
HorusKol

구성과 집계의 차이점이 분명합니다. 집계의 문제점은 일반 연관과 어떻게 다른지 명확하지 않다는 것입니다.
reinierpost


17
  • 작곡은 협회입니다

  • 집계는 협회입니다

  • 구성이 강력한 연관성 (포함 된 오브젝트의 수명이 컨테이너 오브젝트에 전적으로 의존하는 경우이를 강력한 연관이라고 함)

  • 집계는 약한 연결 (포함 된 개체의 수명이 컨테이너 개체에 의존하지 않는 경우 약한 연결이라고 함)

예:

class Contained {
    public void disp() {
        System.out.println("disp() of Contained A");
    }
}

public class Container {
    private Contained c;

    //Composition
    Container() {
        c = new Contained(); 
    }

    //Association 
    public Contained getC() {
        return c;
    }

    public void setC(Contained c) {
        this.c = c;
    }     

    public static void main(String[] args) {
        Container container = new Container();
        Contained contained = new Contained();
        container.setC(contained);
    } 
}

2
구성과 집계가 아닌 집계와 연관의 차이점은 무엇입니까?
reinierpost

11

컴포지션 (혼합)은 간단한 개체 또는 데이터 형식을보다 복잡한 개체로 결합하는 방법입니다. 컴포지션은 많은 기본 데이터 구조의 중요한 구성 요소입니다.

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

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       Aggregation       ║      Composition      ║
╠═══════════╬═════════════════════════╬═══════════════════════╣
║ Life time ║ Have their own lifetime ║ Owner's life time     ║
║ Relation  ║ Has                     ║ part-of               ║
║ Example   ║ Car has driver          ║ Engine is part of Car ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

둘 다 대상 간의 관계를 나타내며 강도 만 다릅니다. 여기에 이미지 설명을 입력하십시오

두 클래스 간의 다른 종류의 종속성에 대한 UML 표기법 여기에 이미지 설명을 입력하십시오

구성 : 엔진은 자동차의 일부이므로 엔진 간의 관계는 구성입니다. Java 클래스간에 구현되는 방법은 다음과 같습니다.

public class Car {
    //final will make sure engine is initialized
    private final Engine engine;  

    public Car(){
       engine  = new Engine();
    }
}

class Engine {
    private String type;
}

집계 : 조직에는 Person이 직원으로 있으므로 관계는 집계입니다. 다음은 Java 클래스 측면에서 어떻게 보이는지입니다.

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

출처


이것은 이전의 12 가지 답변에서 제시되고 설명 된 점들에 비해 실질적인 것을 제공하지 않는 것 같습니다
gnat

도서관 없이도 책이 존재할 수 있습니다. 나쁜 예입니다!
T Blank

여기서 직원 목록은 조직 개체의 일부입니다. 이것이 어떻게 집계가 될 수 있습니까?
살만 무하마드 Ayub

연관은 집계와 어떻게 다릅니 까?
reinierpost

나는이 답변을 좋아한다. 마침내 집계와 구성의 차이점이 무엇인지 올바르게 설명했습니다.
PandasRocks

6

집계는 구슬처럼 간단한 컬렉션입니다.

구성은 상자의 경첩과 같은 내부 / 기능적 종속성을 의미합니다.

자동차는 승객을 모으고; 그들은 자동차의 기능을 손상시키지 않고 들어오고 나갑니다

타이어는 구성 요소입니다. 하나를 제거하면 자동차가 더 이상 제대로 작동하지 않습니다

[참고 : 스페어 타이어는 골재입니다!]


1

나는 항상 '필요한 a', 즉 자동차 엔진을 필요로하는 구성을 보고, 집계를 '목적과 관련된 것'으로 본다. 따라서 자동차 비유를 유지하면서 자동차와 승객을 모으는 여행을 대표 할 수도 있습니다. 여행은 자동차 또는 승객을 소유하지 않으며 특정 시나리오와 관련된 데이터를 집계하고 있습니다. 여행이 완료되면 자동차와 승객은 계속 운행합니다. 자동차가 끝나면 자동차와 엔진은 일반적으로 함께 파괴됩니다.


0

의미 적으로 모든 세트는 서브 세트로 구성됩니다. 따라서:

  • 이러한 하위 집합이 아버지 집합과 독립적으로 존재할 때 집계됩니다. 모니터를 컴퓨터에서 분리하여 다른 컴퓨터에 연결할 수 있습니다.

  • 구성은 이러한 하위 집합이 아버지 집합의 존재에 따라 달라집니다. 잎은 나무의 일부이거나 간은 신체의 일부입니다.

이 개념들은 개념적으로 두 객체 또는 클래스 사이의 의존성에 대해 이야기합니다. 아버지 개체가 처리 할 때 프로그램에서 직접 집계에서 집계 개체도 함께 배치해야합니다. 컴포지션의 동일한 시나리오에서 복합 아들 객체가 지속되고 아버지 객체가 분배됩니다.


-1

이 간단한 예는 어떻습니까?

객체 배열은 컴포지션입니다. 객체에 대한 포인터 배열은 집계입니다.

첫 번째 것을 삭제하면 내용이 사라집니다. 반면에 두 번째 객체는 포인터가 삭제 될 때 각 객체를 삭제하는 특정 방법이 없으면 멤버 존재에 영향을 미치지 않고 사라질 수 있습니다.


3
이것은 이전 11 답변에서 만들어지고 설명 된 점에 실질적인 것을 추가하지 않는 것 같습니다
gnat

@gnat에 동의하지 않습니다. 이것은 두 가지를 구현하는 방법에 대한 유용한 예입니다. 사람들은 예를 통해 더 잘 배웁니다. (포인터 멤버가 집계되었을 가능성이 있고 객체 멤버가 컴포지션 일 가능성이 있다는 것을 이해하기 위해 여기에 왔습니다.
Bob Stein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.