집계 대 구성 [닫힘]


90

UML에서 구성과 집계의 차이점을 이해하는 데 어려움을 겪었습니다. 누군가 나에게 그들 사이의 좋은 비교와 대조를 제공 할 수 있습니까? 또한 코드에서 이들의 차이점을 인식하는 방법을 배우고 /하거나 짧은 소프트웨어 / 코드 예제를보고 싶습니다.

편집 : 내가 묻는 이유 중 일부는 우리가 직장에서하는 역 문서화 활동 때문입니다. 코드를 작성했지만 돌아가서 코드에 대한 클래스 다이어그램을 만들어야합니다. 우리는 연관성을 제대로 포착하고 싶습니다.



다음에서 코드 기반 예제를 확인하십시오. stackoverflow.com/questions/731802/…
Almir Campos

UML 2.5는 차이점을 명확히했습니다. 페이지의 상자를 참조하십시오. 110. 그래서 나는 이것을 다시 열기 위해 투표하고 있습니다.
qwerty_so

아니요, UML 2.5는 구성의 정의를 명확하게하지 않고 오히려 모호한 상태로 남아 있습니다. "복합 개체가 삭제되기 전에 복합 개체에서 일부 개체가 제거 될 수 있으므로 일부로 삭제되지 않을 수 있습니다. 복합 개체. " 아래의 내 대답 ( stackoverflow.com/questions/734891/… )을 참조하십시오. 여기서 구성의 의미를 명확히하려고 노력했습니다. 정답이 결국 승리한다는 것을 보여주기 위해 내 답변을 찬성하십시오 :-) [또는 모든 오답을
Gerd Wagner

답변:


91

집계와 구성의 차이는 컨텍스트에 따라 다릅니다.

다른 답변에 언급 된 자동차의 예를 들어 보겠습니다. 예, 자동차 배기 가스가 "자체적으로"서있을 수 있으므로 자동차와 구성되지 않을 수 있지만 응용 분야에 따라 다릅니다. 실제로 독립형 자동차 배기 가스를 처리해야하는 애플리케이션 (자동차 매장 관리 애플리케이션?)을 빌드하는 경우 집계가 선택이 될 것입니다. 그러나 이것이 간단한 레이싱 게임이고 자동차 배기 가스가 자동차의 일부로 만 사용된다면 구성은 꽤 괜찮을 것입니다.

체스 판? 같은 문제입니다. 체스 말은 특정 응용 프로그램에서만 체스 판 없이는 존재하지 않습니다. 다른 것 (장난감 제조업체와 같은)에서는 체스 말이 체스 판으로 구성 될 수 없습니다.

구성 / 집계를 선호하는 프로그래밍 언어로 매핑하려고하면 상황이 더욱 악화됩니다. 일부 언어에서는 차이를 쉽게 알아 차릴 수 있지만 ( "참조로"대 "값으로", 단순 할 때) 다른 언어에서는 전혀 존재하지 않을 수 있습니다.

그리고 마지막 조언은? 이 문제에 너무 많은 시간을 낭비하지 마십시오. 그만한 가치가 없습니다. 구분은 실제로 거의 유용하지 않습니다 (완전히 명확한 "구성"이 있더라도 캐싱과 같은 기술적 이유 때문에 집계로 구현할 수도 있습니다).


1
나는 체스 말이 아니라 체스 스퀘어라고 말했지만, 모든 유효한 포인트.
David M

2
나는 "그럴 가치가 없다"는 사고 방식에 확실히 문제를 가지고 있습니다. 개체를 "소유"하고 수명에 책임이있는 사람을 생각하지 않으면 개체 CRUD, 특히 정리와 관련된 매우 엉뚱한 코드를 얻을 수 있으며 개체 계층 구조가 잘못된 상태로 남아 있기 때문에 Null 포인터가 날아갑니다.
Chris Kessel

9
예,이 문제에 너무 많은 시간을 낭비해서는 안됩니다. UML은 OOA / OOD 언어입니다. 집계 / 구성은 일반적으로 OOP까지 가장 잘 연기되는 결정입니다. UML 모델에 너무 많은 세부 정보를 입력하려고하면 분석 마비가 발생할 위험이 있습니다.
chimp

13
+1 "이에 너무 많은 시간을 낭비하지 마십시오". 그게 내가 듣고 싶었던 것입니다!
Ronnie

8
"이것에 너무 많은 시간을 낭비하지 마십시오"면접관이 이것을 이해하지 못하는 이유는 무엇입니까?
titogeo

97

경험상 : 여기에 이미지 설명 입력

class Person {
    private Heart heart;
    private List<Hand> hands;
}

class City {
    private List<Tree> trees;
    private List<Car> cars
}

구성에서 (사람, 심장, 손)에서 "하위 개체"(하트, 손)는 사람이 파괴되는 즉시 파괴됩니다.

집합에서 (City, Tree, Car) "하위 개체"(Tree, Car)는 City가 파괴 될 때 파괴되지 않습니다.

결론은 컴포지션이 상호 존재를 강조하고 집계에서이 속성이 필요하지 않다는 것입니다.


2
상호 존재, 좋은의 B-)
jxramos

당신의 노력에 감사드립니다. 아주 좋은 설명과 평신도라면 이것을 이해할 수 있습니다.
Ravindran Kanniah

내가 만난 가장 간단하고 최고의 설명.
아카 쉬 래 가브

최고의 설명 :)
Xiabili

UML 2.5는 차이점을 명확히했습니다. 페이지의 상자를 참조하십시오. (110) 당신의 대답은 지금은 단지 잘못 그래서,
qwerty_so

51

구성 및 집계는 연결 유형입니다. 그들은 매우 밀접하게 관련되어 있으며 프로그래밍 측면에서 둘 사이에 큰 차이가없는 것으로 보입니다. 이 둘의 차이점을 Java 코드 예제로 설명하려고 노력할 것입니다.

Aggregation : 객체가 다른 객체 외부에 존재하고 외부에 생성되므로 생성자에 인수 (예 :)로 전달됩니다. 예 : 사람 – 자동차. 자동차는 다른 컨텍스트에서 생성 된 다음 사람 속성이됩니다.

// code example for Aggregation:
// reference existing HttpListener and RequestProcessor
public class WebServer {
  private HttpListener listener;
  private RequestProcessor processor;
  public WebServer(HttpListener listener, RequestProcessor processor) {
    this.listener = listener;
    this.processor = processor;
  }
}

구성 : 객체는 다른 것의 일부로서 존재하거나 다른 것의 내부에서만 의미가 있습니다. 예 : 사람 – 마음. 당신은 마음을 만들어서 사람에게 전달하지 않습니다. 대신 인간이 창조 될 때 마음이 창조됩니다.

// code example for composition:
// create own HttpListener and RequestProcessor
public class WebServer {
  private HttpListener listener;
  private RequestProcessor processor;
  public WebServer() {
    this.listener = new HttpListener(80);
    this.processor = new RequestProcessor(“/www/root”);
  }
}

여기에 집계와 구성의 차이점 예를 설명했습니다.


5
지금까지 최고의 답변 중 하나입니다. Neat :)
Rohit Singh

6
객체가 다른 객체와 함께 (구성) 또는없이 (집계) 존재할 수있는 경우를 보여주는 최고의 Java 코드 예제입니다.
마이클 Dobi Dobrzański

제발, 우리가 작곡을 위해 final을 사용 해야하는지 알고 싶습니다.
Outreagous ONE 2011

36

컴포지션은 자식 개체가 부모와 수명을 공유 함을 의미합니다. 집계는 그렇지 않습니다. 예를 들어, 체스 판은 체스 스퀘어로 구성되어 있습니다. 체스 스퀘어는 보드 없이는 실제로 존재하지 않습니다. 그러나 자동차는 부품의 집합체입니다. 자동차 배기 가스는 당시 자동차의 일부가 아니라면 여전히 자동차 배기 가스입니다.


18

제가 배운 예는 손에 대한 손가락이었습니다. 당신의 손은 손가락으로 구성되어 있습니다. 그것들을 소유하고 있습니다. 손이 죽으면 손가락도 죽습니다. 손가락을 "집계"할 수 없습니다. 여분의 손가락을 잡고 원하는대로 손에 붙이고 떼어 낼 수는 없습니다.

디자인 관점에서 볼 때 여기의 가치는 다른 포스터가 말했듯이 종종 개체 수명과 관련이 있습니다. 고객이 있고 계정이 있다고 가정합니다. 해당 계정은 고객의 "구성된"개체입니다 (적어도 대부분의 컨텍스트에서 생각할 수 있음). 고객을 삭제하면 계정 자체에 가치가 없으므로 삭제됩니다. 그 반대는 종종 객체 생성에 적용됩니다. 계정은 고객의 맥락에서만 의미를 갖기 때문에 고객 생성의 일부로 계정 생성이 발생합니다 (또는 느리게 수행하는 경우 일부 고객 거래의 일부가 됨).

디자인에서 어떤 개체가 다른 개체를 소유 (구성)하는 것과 다른 개체를 참조 (집계)하는 개체를 생각하는 것이 유용합니다. 개체 생성 / 정리 / 업데이트에 대한 책임이 어디에 있는지 확인하는 데 도움이 될 수 있습니다.

코드에 관해서는 종종 말하기가 어렵습니다. 코드의 대부분은 개체 참조이므로 참조 된 개체가 구성 (소유)인지 집계되었는지 여부가 명확하지 않을 수 있습니다.


15

사이의 차이점에 대해 존재 얼마나 많은 혼란이 놀라운 부분 - 전체 - 협회 개념 응집구성 . 주된 문제는 구성의 개념이 전체 없이는 부분이 존재할 수 없도록 전체와 부분 사이의 수명주기 종속성을 암시한다는 광범위한 오해 (전문 소프트웨어 개발자 및 UML 작성자 사이에서도)입니다. 그러나이 견해는 공유 할 수없는 부분과 부분-전체-연관이있는 경우도 있다는 사실을 무시하고 부분이 전체의 파괴에서 분리되어 살아남을 수 있습니다.

UML 사양 문서에서 "구성"이라는 용어의 정의는 항상 공유 할 수없는 부분을 의미했지만 "구성"의 정의 특성이 무엇인지, 그리고 단순히 선택적 특성이 무엇인지는 명확하지 않습니다. 새 버전 (2015 년 현재)에서도 UML 2.5는 "구성"이라는 용어의 정의를 개선하려는 시도 후에도 여전히 모호한 상태로 남아 있으며 비와 부분 전체 연결을 모델링하는 방법에 대한 지침을 제공하지 않습니다. 부분이 분리 될 수없고 전체가 함께 파괴되는 경우와는 반대로, 부분이 분리 될 수 있고 전체가 파괴 되어도 살아남을 수있는 공유 가능한 부분. 그들은 말한다

복합 객체가 삭제되면 객체 인 모든 부품 인스턴스도 함께 삭제됩니다.

그러나 동시에 그들은 또한 말합니다

부품 객체는 복합 객체가 삭제되기 전에 복합 객체에서 제거 될 수 있으므로 복합 객체의 일부로 삭제되지 않습니다.

이러한 혼동은 UML 정의가 불완전 함을 나타내며, 이는 컴포넌트와 컴포지트 간의 라이프 사이클 종속성을 고려하지 않습니다. 따라서 컴포넌트를 컴포지트에서 분리 할 수 ​​없으므로 컴포지트가 파괴 될 때마다 소멸되어야 하는 << 분리 불가 >> 컴포지션에 대한 UML 스테레오 타입을 도입하여 UML 정의를 향상시킬 수있는 방법을 이해하는 것이 중요합니다 .

1) 구성

마찬가지로 마틴 파울러 설명했다 , 조성물의 특성의 주된 문제는 "오브젝트는 하나 개의 구성 관계의 일부분 일 수있다"이다. 이것은 Geert Bellekens 의 우수한 블로그 게시물 UML Composition vs Aggregation vs Association 에서도 설명됩니다 . 컴포지션의 이러한 정의 특성 ( 배타적 또는 공유 불가능한 부분 포함) 외에도 컴포지션에는 컴포지션과 해당 구성 요소 간의 수명주기 종속성이있을 수 있습니다. 실제로 이러한 종속성에는 두 가지 종류가 있습니다.

  1. 컴포넌트 가 항상 컴포지트에 연결 되어야하는 경우, 즉 컴포지션 라인의 컴포지트 측면에서 "정확히 1"다중성으로 표현되는 필수 컴포지트 가있는 경우에는 다시 사용해야합니다. 다른 컴포지트에 (또는 다시 연결) 현재 컴포지트가 파괴되면 파괴됩니다. 이는 아래 다이어그램과 같이 Person와 사이의 구성으로 예시됩니다 Heart. 심장은 소유자가 사망했을 때 파괴되거나 다른 사람에게 이식됩니다.
  2. 컴퍼넌트마다 분리 할 수없는 것이있다 환언 그 합성하거나로부터 분리 하고, 단지 그 다음, 구성 요소는 복합체가 파괴 될 때, 폐기되어야한다. 분리 부와 같은 조성물의 일례의 조성물 PersonBrain.

여기에 이미지 설명 입력

요약하면 수명주기 종속성은 특정 구성 사례에만 적용되지만 일반적으로는 적용되지 않으므로 정의되는 특성이 아닙니다.

UML 사양에는 "복합 인스턴스가 삭제되기 전에 복합 인스턴스에서 일부가 제거 될 수 있으므로 복합 인스턴스의 일부로 삭제되지 않을 수 있습니다."라고 명시되어 있습니다. Car- Engine구성 의 예 에서 다음 다이어그램과 같이 자동차가 파괴되기 전에 엔진을 자동차에서 분리 할 수있는 경우가 분명합니다.이 경우 엔진이 파괴되지 않고 재사용 할 수 있습니다. 이것은 컴포지션 라인의 합성면에서 0 또는 1의 다중성을 의미합니다.

여기에 이미지 설명 입력

다중 복합 측의 조성물의 연결 단부 중 어느 하나 또는 0..1이고, 필수 성분은 합성이 있으면 사실에 따라 (a 복합체에 부착되어야한다) 여부. 구성 요소가 분리 불가능한 경우 이는 필수 구성 요소가 있음을 의미합니다.

2) 집계

집계는 전체의 일부를 다른 전체와 공유 할 수있는 부분-전체-관계의 의도 된 의미와 관련된 또 다른 특수한 형태의 연관입니다. 예를 들어, 다음 다이어그램에 표시된대로 클래스 DegreeProgram와 의 집계를 모델링 할 수 있습니다 Course. 코스는 학위 프로그램의 일부이고 코스는 둘 이상의 학위 프로그램간에 공유 될 수 있습니다 (예 : 공학 학위는 C를 공유 할 수 있음). 컴퓨터 과학 학위가있는 프로그래밍 과정).

여기에 이미지 설명 입력

그러나 공유 가능한 부분 이 있는 집계의 개념은 실제로 그다지 의미가 없으므로 구현에 아무런 영향을 미치지 않으므로 많은 개발자가 클래스 다이어그램에서 흰색 다이아몬드를 사용하지 않고 단순한 연결을 모델링하는 것을 선호합니다. 대신. UML 스펙은 "공유 집계의 정확한 의미는 애플리케이션 영역과 모델러에 따라 다릅니다"라고 말합니다.

다수 전체 측 집합체의 연관 단부는 임의의 수 (*) 일부에 속하거나 할 수 있기 때문에 수있다 공유 wholes의 임의의 수 중에서.


2
구성은 수명주기와 엄격하게 관련되지 않지만 대부분의 실제 문제에서 수명주기는 구성 또는 집계 여부에 대한 주요 동기입니다. 나는 내 대답에서 수명주기가 항상 관련되기보다는 "종종"관련되어 있다고 말하면서 헤지했다. 라이프 사이클이 필요하지 않다는 점을 알아 두는 것이 좋지만 뷰가 "주된 문제"이고 잘못된 (멋진 굵은 글꼴로 표시됨)이라고 말하면 도움이되지 않고 실제 사용 고려 사항을 지적하는 데 방해가됩니다.
Chris Kessel 2015 년

나는 매우 동의하지 않습니다. 수명주기 고려 사항은 "구성 할 것인지 집계 할 것인지에 대한 기본 동기 부여"가 될 수 없습니다. 많은 경우 연관성이 모든 종류의 부분 전체 실현 (집계 또는 구성)을 나타내는 경우 독립적으로 연관되기 때문입니다. 연결에 필수 참조 속성에 해당하는 하한 다중도가 0보다 큰 끝이있을 때마다 수명주기 종속성이 발생합니다.
Gerd Wagner

9

코드 측면에서 컴포지션은 일반적으로 포함하는 개체가 구성 요소 *의 인스턴스를 생성하는 책임이 있고 포함하는 개체가 이에 대한 유일한 장기 참조를 보유하고 있음을 나타냅니다. 따라서 부모 개체가 역 참조되고 가비지 수집되면 자식도 마찬가지입니다.

그래서이 코드는 ...

Class Order
   private Collection<LineItem> items;
   ...
   void addOrderLine(Item sku, int quantity){
         items.add(new LineItem(sku, quantity));
   }
}

LineItem이 주문의 구성 요소임을 제안합니다. LineItem은 포함 된 주문 외부에 존재하지 않습니다. 그러나 Item 객체는 순서대로 구성되지 않습니다. 필요에 따라 전달되며 상점에 주문이 없더라도 계속 존재합니다. 구성 요소가 아니라 연관되어 있습니다.

* nb 컨테이너는 구성 요소를 인스턴스화하는 역할 을하지만 실제로 new ... () 자체를 호출하지 않을 수 있습니다. 이것은 Java이므로 일반적으로 먼저 처리 할 팩토리가 한두 개 있습니다!


0

다른 답변에 제공된 개념적 그림은 유용하지만 도움이 된 또 다른 요점을 공유하고 싶습니다.

나는 코드 생성을위한 UML, 소스 코드를위한 UML 또는 관계형 데이터베이스를위한 DDL에서 약간의 마일리지를 얻었습니다. 거기에서, 나는 테이블에 널 불가능한 외래 키 (데이터베이스에 있음)와 널 불가능한 "부모"(그리고 종종 "최종") 객체가 있음을 나타 내기 위해 구성을 사용했습니다. 레코드 또는 개체가 "고아"로 존재하거나 부모 개체에 연결되지 않거나 다른 부모 개체에 의해 "적용"될 수 있도록 집계를 사용합니다.

즉, 모델에 대한 코드를 작성할 때 필요할 수있는 몇 가지 추가 제약을 암시하기 위해 컴포지션 표기법을 속기로 사용했습니다.


0

내가 좋아하는 예 : 구성 : 물은 연못 의 일부 입니다. (연못은 물의 구성입니다.) 집합 : 연못 에는 오리와 물고기가 있습니다 (연못 에는 오리와 물고기가 집합합니다)

보시다시피 저는 "part-of"와 "has"를 굵게 표시했습니다.이 두 구문은 일반적으로 클래스간에 어떤 종류의 연결이 있는지를 가리킬 수 있기 때문입니다.

그러나 다른 사람들이 지적했듯이 연결이 컴포지션인지 집계인지는 애플리케이션에 따라 여러 번 다릅니다.


그러나 일부 및 일부 용어가 때때로 혼동됩니다. 예를 들어, Person 클래스는 이름이 "has"이므로 Person이 이름과 집계 관계를 갖는 것으로 표시됩니다. 실은 구성 관계입니다. 왜? Person 객체가 파괴되면 이름도 파괴되어야합니다. 그리고 "이름은 사람의 일부입니다"라는 용어는 자연스럽게 들리지 않습니다.
Asif Shahzad

0

집계 관계와 복합 관계를 구분하는 것은 너무 어렵지만 몇 가지 예를 들어 보겠습니다. 집과 방이 있고 여기에 복합 관계가 있고 방은 집의 일부이며 방 생활이 시작되었습니다. 집 생활이 끝나고 Will은 집 생활이 끝날 때 끝납니다. 방은 집의 일부입니다. 우리는 국가와 수도, 책 및 페이지와 같은 구성에 대해 이야기합니다. 종합적인 관계의 예를 들어, 팀과 플레이어를 예로 들어, 플레이어는 팀없이 존재할 수 있고, 팀은 플레이어 그룹이며, 플레이어 생활은 팀 생활 이전에 시작할 수 있습니다. 프로그래밍에 대해 이야기하면 플레이어를 만들 수 있고 팀을 만들 것입니다. 그러나 컴포지션 아니오를 위해 우리는 집 안에 방을 만듭니다. 구성 ----> 합성 | 구성. 집계 -------> 그룹 | 요소


0

용어를 설정합시다. 집계는 UML 표준의 메타 용어이며 단순히 shared 라는 이름의 구성 및 공유 집계를 의미 합니다. 종종 "집계"로 잘못 명명됩니다. 구성도 집계이기 때문에 BAD입니다. 내가 알기로는 "공유"를 의미합니다.

UML 표준에서 추가 :

복합-속성이 복합적으로 집계됨을 나타냅니다. 즉, 복합 객체가 구성된 객체 (부품)의 존재 및 저장을 담당합니다.

따라서 카테 드라는 대학 (IMHO) 외부에 존재하지 않기 때문에 대학과 카테 드라 연결은 구성입니다.

공유 집계의 정확한 의미는 애플리케이션 영역과 모델러에 따라 다릅니다.

즉, 자신이나 다른 사람의 일부 원칙 만 따르는 경우 다른 모든 연결을 공유 집계로 그릴 수 있습니다. 또한 여기를보십시오 .


0

신장, 간, 뇌와 같은 인체 부위를 고려하십시오. 여기서 구성 및 집계 개념을 매핑하려고하면 다음과 같습니다.

신장과 간과 같은 신체 부위 이식이 도래하기 전에는이 두 신체 부위가 인체와 구성되어있어 인체와 분리되어 존재할 수 없습니다.

그러나 신체 부위 이식의 도래 후에는 다른 인체에 이식 할 수 있기 때문에 이제는 인체와 분리되어 존재하는 것이 가능 해져이 부분이 인체와 응집되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.