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

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



답변

구성

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();
  }
}

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


답변

좋은 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);
     }
}

이 주위에 뭔가.


답변

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

여기에 이미지 설명 입력

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

확인해주십시오!!!


답변

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

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

UML 표준에서 추가 :

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

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

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

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


답변

간단히 말해서 :

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


답변

간단한 작곡 프로그램

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);

    }
}


답변

먼저 동일한 페이지에있는 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 관계가 집계가 될 수 있습니다.