본문 바로가기

JAVA/OOP

복합객체

반응형

복합객체의 개념

복합객체

- 객체지향에서 객체란 단순히 데이터와 함수만을 갖는 작은 단위뿐만 아니라 데이터 부분에 다른 객체를 갖을 수 있는데 이와 같은 관계를 복합화(Composition) 또는 복합관계라고 한다.


- 복합화는 한 객체가 다른 객체를 포함하는 것으로 집단화(Aggregation)라고도 한다.

- 한 객체가 다른 객체를 포함할 때 이 객체를 복합객체.


객체가 다른 객체를 포함할 경우

포함하는 객체를 전체객체(Whole Object)

포함되는 객체를 부분객체(Part Object)


예) 자동차와 자동차 내의 부품(엔진, 바퀴), 주문과 결제 간의 관계


자동차 객체는 부분객체인 엔진, 바퀴 등과 같은 부분객체들이 모여서 만들어진 객체이다.

복합객체인 자동차는 부분객체들이 없으면 자동차로서의 제기능을 다할 수 없다.

결국 의미있는 단위의 객체가 되지 못한다.


쇼핑몰도 주문과 결제, 주문과 배송과 관계가 복합관계.

주문이 이루어지기 위해서는 결제와 배송이 함께 포함되어야 한다.

결제가 없거나 배송이 없는 주문은 무의미한 객체가 된다.


자동차 객체에 포함된 부분객체들이 서로 강한 의존관계에 있다.

자동차 객체는 부분객체가 없이는 존재할 수 없으며, 부분 객체 또한 자동차 객체에 포함되면 다른 객체에 포함될 수 없다.


복합객체의 특성

객체들 간의 관계는 여러가지 다양한 형태로 존재할 수 있다. (연관관계, 포함관계, 상속관계 등)

복합객체는 포함관계로서 이러한 관계는 여러 상황들 속에서 형성된다.


1. 객체가 선언되는 시점에 발생한다.

- 객체가 선언되는 시점이란 전체 객체 내의 데이터 부분에 부분 객체가 정의되는 것.

에) 주문 객체의 데이터 부분에 주문 금액, 주문수량, 주문일자 등과 같이 원시 타입의 데이터 뿐만 아니라 결제나 배송 클래스의 객체가 선언되는 것이다.


public class Order {

String orderId;

int amount;

String orderDate;

Payment paymentType;

Delivery delivery;

}


2. 클래스의 객체 생성함수 내에서 발생한다.

- 객체들 간의 복합 관계는 복합객체를 생성하는 객체 생성함수 내에서 부분 객체가 함께 생성될 수 있다.

이 경우가 복합 관계에서 전체객체와 부분객체 사이의 의존도가 가장 강한 관계이다.

이 경우 전체 객체와 부분객체의 생명주기가 동일하기 때문에 의존도가 더 강하다고 표현한다.

생명주기가 동일하다는 것은 전체 객체가 생성될때 부분객체가 함께 생성되고, 전체객체가 소멸되면 부분객체도 함께 소멸된다.

예) 주문할때 동시에 결제와 배송 객체를 생성

주문과 동시에 결제와 배송 정보를 함께 입력받아 처리할 수 있고, 주문을 한뒤 결제 그리고 난 후 배송 정보를 처리하는 경우도 있다.

이 경우는 전자에 해당


예) 클래스 객체 생성함수 내에서 복합관계

public class Order {

String orderId;

int amount;


public Order(String orderId, int amount, ...) {

Payment payment = new Payment();

Delivery delivery = new Delivery();

}

}



UML에서는 복합관계를 복합화 또는 합성화(Composition) / 집단화(Aggregation) 나뉨.


3. 실제 해당 객체를 사용하기 직전에 발생한다.

객체들 간의 복합관계는 복합관계가 필요한 시점에 부분 객체를 포함시킬 수 있다.

이는 복합객체 내의 함수들 가운데서 특정 함수를 수행할 때 해당 함수 내에서 부분 객체를 생성하여 사용하는 경우다.

전체 객체 내의 특정함수에만 부분 객체가 참조되기 때문에 다른 경우보다 가장 의존도가 약하다고 볼 수 있다.

예) 총금액을 계산하는 함수에 결제 정보와 배송정보가 필요하고 이를 통해 총 금액을 계산해야 하기 때문에 computeTotalFee() 함수에게 결제 객체와 배송 객체를 생성하여 결재 및 배송 정보를 가져온다.


예) 특정함수 내에서 복합관계

public class Order {

String orderId;

int amount;


public void computeTotalFee() {

Payment payment = new Payment();

Delivery delivery = new Delivery();

payment.getPaymentInfo();

delivery.getDeliveryInfo();


}

}


UML


복합객체는 복합관계 표기를 이용하여 부분객체를 포함하는 설계하며 2개 이상의 부품 객체를 포함하여 정의할 수 있다.


집단화(Aggregation)는 복합객체와 부분객체의 생명주기가 서로 다를 수 있는 복합관계


public class Order {

String orderId;


Payment paymentType;

Delivery delivery;

}


합성화(Composition)는 부분객체는 복합객체에 종속되기 때문에 부분객체는 복합객체의 생명주기를 따른다.


public class Order {

public Order() {

Payment payment = new Payment();

Delivery delivery = new Delivery();

}

}


정리

- 복합객체는 한 객체가 다른 객체를 포함하는 객체를 말한다.

- 복합객체는 포함하는 부분객체들이 없이는 의미있는 객체가 되지 못한다.

- 복합객체에 포함되는 부분객체는 복합객체에 종속되어 있다.

- 객체들 간의 복합관계는 객체가 선언되는 시점에 발생한다.

- 객체들 간의 복합관계는 클래스 객체 생성 함수 내에서 발생한다.

- 객체들 간의 복합관계는 실제 해당 객체를 사용하기 직전에 발생한다.

- 복합객체 개념은 UML에서는 집단화와 합성화로 구분된다.

- 합성화는 전체객체와 부분객체의 생명주기가 동일하지만 집단화는 서로 다를 수 있다.



출처-UML과 JAVA로 배우는 객체지향 설계 및 구현

반응형

'JAVA > OOP' 카테고리의 다른 글

추상클래스  (0) 2018.04.18
상속  (0) 2018.04.17
메시지  (0) 2018.04.16
캡슐화와 정보은닉  (1) 2018.04.13
클래스와 객체  (0) 2018.04.13