본문 바로가기
Java

클래스 간에 연관관계

by leo21c 2012. 12. 6.
SMALL

1. C++에서 클래스 간의 연관관계는 프로그램에서 상대 클래스를 가리키는 데이터 멤버로 구현된다.
 예를 들어 아래와 같은 연관관계가 있다고 하면

class Client {
	private:
		String name;
		int age;
	public:
		String getName() {
			return this->name;
		}
		int getAge() {
			return this->age;
		}
		void writeContact() {
		
		}
};

class Salesman {
	private:
		Client* client;
	public:
		void setClient(Client* client) {
			this->client = clinet;
		}
		void explainContact() {
			String name = this->client->getName();
			int age = this->client->getAge();
		}
};

 위의 소스와 같이 Salesman class에서 Clinet 객체를 사용하고 있다. Salesman은 Client를 알지만 Client는 Salesman을 모른다.
 시스템은 setClient() 함수를 이용해서 두 객체 사리의 관계를 맺어준다.

 만약 서로 연관 관계를 가지고 있다면 각 Class에 사용되는 Class 객체를 서로 가지고 있다는 것이다. Salesman class에서 Client 객체 변수를 사용하고 Client class에서 Salesman 객체 변수를 사용하는 것이다.

2. 다중성(Multiplicity)이란?
 - 다중성은 연관 관계가 있는 여러개의 클래스가 있을 때 실제로 연관을 가지는 객체의 수를 나타낸다.
 - 다중성 표현은 아래와 같이 한다.
 1   : 한 객체가 연관. 표시하지 않으면 기본값이 1이다.
 0..1: 0 또는 1개의 객체와 연관
 0..*: 0 또는 많은 수의 객체와 연관
 *   : 0..*와 일치
 1..*: 1개 이상과 연관
 2..5: 2개에서 5개까지 연관

 - 다중 연관 관계는 배열이나 List 등과 같이 여러개의 객체를 관리해서 처리하는 방식으로 이용을 한다.

class Client {
	private:
		String name;
		int age;
	public:
		String getName() {
			return this->name;
		}
		int getAge() {
			return this->age;
		}
		void writeContact() {
		
		}
};

class Salesman {
	private:
		int count;
		Client* clientArray[];
	public:
		void addClient(Client* client) {
			clientArray[count] = client;
			count++;
		}
		void explainContact(int index) {
			String name = (Client*)(this->clientArray[index])->getName();
			int age = (Client*)(this->clientArray[index])->getAge();
		}
};


3. 집합 관계, 포함 관계
 - Aggregation(집합) 관계: 한 객체가 다른 객체를 포함하는 것을 나타낸다.
   "전체", "부분"과의 관계로 "전체" 쪽에 마름모를 표시한다.
 - Composition(포함) 관계는 집한 관계의 한 분류로서 채워진 마름모로 표시되며 부분 객체가 전체 객체에 속하는 관계로 전체 객체가 사라지면 부분 객체도 사라지는 경우를 의미한다.
 - 공유 될 수 있는 객체를 사용할 경우에는 비어있는 마름모로 표시한다.

4. 의존 관계
 : 한 클래스의 변경이 다른 클래스에도 영향을 주는 상황에서 사용된다. 의존 관계는 일반화, 포함, 연관 관계에 비해서 개념적으로 보다 자세한 상황을 표현하며, 구체적으로 말하면 다음과 같은 세가지 경우에 클래스 간에 의존 관계가  발생할 수 있다.
 - 연산의 인자로 사용 될 때
 - 메소드 내부의 지역 객체
 - 전역 객체

 C++ 프로그램에서는 클래스 간의 의존 관계는 한 클래스가 다른 클래스의 연산(함수)의 인자(파라메터)로 사용되는 경우, 멤버 함수 내에서 지역 객체를 정의할 때 사용되는 경우 또는 전역 객체를 접근하는 경우에 발생한다.

 Java는 다른 클래스의 메소드 인자, 메소드 내의 지역 객체를 정의할 때 사용된다.


5. 연관 관계와 의존 관계의 비교

비교 항목

연관 관계

 의존 관계

역할

메세지 전달의 통로

코드와의 관련성

 클래스의 속성으로 표현 

 연산의 인자, 지역 객체, 전역 객체를 의미

관계의 범위 

 클래스의 범위 

 하나의 연산 범위

방향성 

 양방향   단방향 


참고자료: 클래스 구조의 이해와 설계

LIST