Java에서 집계와 구성의 구현 차이점


102

집계와 구성의 개념적 차이점을 알고 있습니다. 누군가 예제를 통해 Java의 구현 차이점을 말해 줄 수 있습니까?


3
이 링크를 따라 가면 게시물에 대한 답변을 얻을 수 있습니다. [집계와 구성의 차이점] [1] [1] : stackoverflow.com/a/1468285/1353243
gks

의 가능한 중복 구성에 비해 집계
알렉스 K


객체간에 관계가있을 때이를 연관이라고합니다. 집계 및 구성은 둘 다 전문화 된 형태의 협회입니다. 컴포지션은 다시 집계의 전문화 된 형태입니다. javabench.in/2011/08/difference-between-association.html
Raúl

당신은 더 많은 답을 찾을 수 있습니다 여기에
하메드 moosaei

답변:


222

구성

final class Car {

  private final Engine engine;

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

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

집합

final class Car {

  private Engine engine;

  void setEngine(Engine engine) {
    this.engine = engine;
  }

  void move() {
    if (engine != null)
      engine.work();
  }
}

구성의 경우 엔진은 자동차에 의해 완전히 캡슐화됩니다. 외부 세계가 엔진에 대한 참조를 얻을 수있는 방법은 없습니다. 엔진은 자동차와 함께 살고 죽습니다. 집계를 사용하면 자동차도 엔진을 통해 기능을 수행하지만 엔진이 항상 자동차의 내부 부분이되는 것은 아닙니다. 엔진을 교체하거나 완전히 제거 할 수도 있습니다. 뿐만 아니라 외부 세계는 여전히 엔진에 대한 참조를 가질 수 있으며 자동차에 있는지 여부에 관계없이이를 수정할 수 있습니다.


7
좋은 예! 또한 컴포지션을 강력한 연관 (엔진 없이는 Car는 의미가 없음)으로, 집계는 약한 연관으로 표시합니다 (엔진이없는 자동차는 전적으로 의미가 있으며 생성자에도 필요하지 않습니다). 어느 것을 사용할까요? 상황에 따라 다릅니다.
Federico Pugnali

@Anand 집계에서 제공하는 예제는이 종속성 예제가 아닙니까? 종속성은 더 약한 관계 형식이며 코드 용어로 클래스가 매개 변수 또는 반환 유형별로 다른 클래스를 사용함을 나타냅니다.
OOkhan

@Anand : 왜 이렇게 말했는지 더 설명해 주시겠습니까? 구성의 경우 외부 세계가 엔진에 대한 참조를 얻을 수있는 방법이 없습니다. 집계를 사용하면 외부 세계가 엔진에 대한 참조를 가질 수 있습니까? 코드 샘플에서 외부 세계가 엔진에 대한 참조를 가질 수 있는지 여부를 보여줄 수 있습니까? 덕분에
O 코너

9
이것은 올바른 예가 아닙니다. 외부 세계는 내부 개체에 액세스 할 수 있지만 그 정체성은 항상 외부 개체와 연결되어있는 반면 집계에서 내부 개체는 자동차가 없더라도 독립적으로 존재할 수 있습니다. 이 경우 new Engine(EngineSpecs)차가 없어도 호출을 사용하여 엔진을 만들 수 있습니다 . 컴포지션을 달성하는 방법은 Engine을 내부 클래스로 생성하는 것이므로 엔진의 객체는 항상 Car Object를 참조하여 생성됩니다
mickeymoon

@mickeymoon 대단한 캐치. 더 나은 예를 알려 주시겠습니까?
Gayan Weerakutti 2016

19

좋은 UML 예제를 사용합니다.

1 ~ 20 개의학과가 있고 각학과에 1 ~ 5 명의 교수가있는 대학을 선택합니다. 대학과학과 사이에는 구성 링크가 있습니다. 학과와 교수 사이에는 통합 링크가 있습니다.

작곡은 단지 강력한 집합체 일뿐입니다. 대학이 파괴되면 부서도 파괴되어야합니다. 하지만 각학과가 사라져도 교수를 죽이면 안된다.

자바에서 :

public class University {

     private List<Department> departments;

     public void destroy(){
         //it's composition, when I destroy a university I also destroy the departments. they cant live outside my university instance
         if(departments!=null)
             for(Department d : departments) d.destroy();
         departments.clean();
         departments = null;
     }
}

public class Department {

     private List<Professor> professors;
     private University university;

     Department(University univ){
         this.university = univ;
         //check here univ not null throw whatever depending on your needs
     }

     public void destroy(){
         //It's aggregation here, we just tell the professor they are fired but they can still keep living
         for(Professor p:professors)
             p.fire(this);
         professors.clean();
         professors = null;
     }
}

public class Professor {

     private String name;
     private List<Department> attachedDepartments;

     public void destroy(){

     }

     public void fire(Department d){
         attachedDepartments.remove(d);
     }
}

이 주위에 뭔가.


초기화되지 않은 목록 및 생성자에 대한 의견을 얻지 않기를 바랍니다. 나는, 누락 된 부분이 상식이 신속하게 쓴하지만 요구한다면, 나는 해결책 완료
TecHunter

감사! 귀하의 예는 완벽하게 명확합니다. 그러나 나는 당신의 코드 일러스트레이션을 이해할 수 없었습니다. 둘의 기본적인 구현 차이점 을 말씀해 주 시겠습니까? 집계 또는 구성을 구현해야하는 경우 Java에서 어떤 개념을 사용해야합니까?
Rajath

당신이 내 편집처럼 인스턴스를 관리하는 방식으로 반영되어야 클래스하지만 구성에 대해 이야기하면 그것은 정확히 같은 구현입니다
TecHunter

4

아래 주어진 URL에 훌륭한 설명이 있습니다.

여기에 이미지 설명 입력

http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit

확인해주십시오!!!


안녕하세요 Rahul,이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다. 여기를보십시오. 일부 답변은 왜 그리고 어떻게 삭제됩니까?
bummi

3

차이점은 모든 컴포지션이 집계이며 그 반대가 아니라는 것입니다.

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

UML 표준에서 추가 :

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

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

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

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


3

간단히 말해서 :

구성과 집계는 모두 연관입니다. 구성-> 강력한 Has-A 관계 집계-> 약한 Has-A 관계.


2

간단한 작곡 프로그램

public class Person {
    private double salary;
    private String name;
    private Birthday bday;

    public Person(int y,int m,int d,String name){
        bday=new Birthday(y, m, d);
        this.name=name;
    }


    public double getSalary() {
        return salary;
    }

    public String getName() {
        return name;
    }

    public Birthday getBday() {
        return bday;
    }

    ///////////////////////////////inner class///////////////////////
    private class Birthday{
        int year,month,day;

        public Birthday(int y,int m,int d){
            year=y;
            month=m;
            day=d;
        }

        public String toString(){
           return String.format("%s-%s-%s", year,month,day);

        }
    }

    //////////////////////////////////////////////////////////////////

}
public class CompositionTst {

    public static void main(String[] args) {
        // TODO code application logic here
        Person person=new Person(2001, 11, 29, "Thilina");
        System.out.println("Name : "+person.getName());
        System.out.println("Birthday : "+person.getBday());

        //The below object cannot be created. A bithday cannot exixts without a Person 
        //Birthday bday=new Birthday(1988,11,10);

    }
}

2

먼저 동일한 페이지에있는 Aggregation과 의 차이점에 대해 이야기해야합니다 Composition.

집계는 연관된 엔티티가 연관과 독립적으로 존재할 수있는 연관입니다. 예를 들어, 개인은 조직에 연관 될 수 있지만 시스템에 독립적으로 존재할 수 있습니다.

이므로

구성이란 관련 엔티티 중 하나가 다른 엔티티와 밀접하게 관련되어 있고 다른 엔티티 없이는 존재할 수없는 상황을 말합니다. 실제로 해당 엔티티의 신원은 항상 다른 객체의 신원과 연관됩니다. 예를 들어, 자동차의 바퀴.

이제 다음과 같이 한 엔터티의 속성을 다른 엔터티에 유지하여 간단히 집계를 수행 할 수 있습니다.

class Person {
    Organisation worksFor;
}

class Organisation {
    String name;
}

class Main {
    public static void main(String args[]) {

        //Create Person object independently
        Person p = new Person();

        //Create the Organisation independently
        Organisation o = new Organisation();
        o.name = "XYZ Corporation";

        /*
          At this point both person and organisation 
          exist without any association  
        */
        p.worksFor = o;

    }
}

Composition의 경우 종속 개체는 항상 연결된 개체의 ID로 만들어 져야합니다. 동일한 내부 클래스를 사용할 수 있습니다.

class Car {
    class Wheel {
        Car associatedWith;
    }
}

class Main {
    public static void main() {
        //Create Car object independently
        Car car = new Car();

        //Cannot create Wheel instance independently
        //need a reference of a Car for the same.
        Car.Wheel wheel = car.new Wheel();
    }
}

애플리케이션 시나리오에 따라 동일한 사용 사례가 집계 / 구성에 해당 할 수 있습니다. 예를 들어, 일부 조직에서 일하는 사람들을위한 애플리케이션을 개발하고 등록을 위해 조직에 대한 참조가 필수 인 경우 개인-조직 사례가 구성이 될 수 있습니다. 마찬가지로 자동차 부품에 대한 재고를 유지 관리하는 경우 Car-Wheel 관계가 집계가 될 수 있습니다.


1

집계 대 구성

집계자식 이 부모와 독립적으로 존재할 수 있는 관계를 의미합니다 . 예를 들어, 은행 및 직원은 은행을 삭제하고 직원은 여전히 ​​존재합니다.

반면 구성자식 이 부모와 독립적으로 존재할 수없는 관계를 의미합니다 . 예 : 인간과 심장, 심장은 인간과 분리되어 존재하지 않습니다.

집계 관계는 "has-a" 이고 구성은 "part-of"관계입니다.

구성 은 강력한 연결이고 집계는 약한 연결입니다.


0

두 유형은 물론 연관이며 실제로 그런 언어 요소에 엄격하게 매핑되지는 않습니다. 차이점은 목적, 컨텍스트 및 시스템 모델링 방법에 있습니다.

실용적인 예로, 유사한 엔티티를 가진 두 가지 유형의 시스템을 비교하십시오.

  • 주로 자동차와 그 소유자 등을 추적 하는 자동차 등록 시스템 입니다. 여기서 우리는 별도의 엔터티로서 엔진에 관심이 없지만 동력 및 연료 유형과 같은 엔진 관련 속성이 여전히있을 수 있습니다. 여기서 엔진은 자동차 엔티티 의 복합 부분 일 수 있습니다 .

  • 자동차 부품을 관리하고, 자동차를 정비하고, 부품 (아마도 완전한 엔진)을 교체 하는 자동차 서비스 점 관리 시스템 입니다. 여기에서 우리는 심지어 엔진을 비축하고 있고 그것들과 다른 부품을 개별적으로 그리고 자동차와 독립적으로 추적해야 할 필요가 있습니다. 여기서 엔진은 자동차 엔티티 의 집계 된 부분 일 수 있습니다 .

이 수준에서 가독성과 같은 것이 훨씬 더 중요하기 때문에 이것을 언어로 구현하는 방법은 사소한 문제입니다.

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