집합aggregation
Has-a 어떤 사람이 자동차를 가지고 있다.
사람이 없어도 자동차는 있을 수 있다(느슨한관계)


학교에는 수업,교수,학생이 있다.

한교수가 여러개의 강의를 할 수 있고
한학생이 여러 수업을 들을 수 있다.

구성관계로 개발하면 정보가 공유되지 않는다.
또, 강의 객체가 없어지면 모든 정보가 사라진다.
객체1 : 학교{강의{교수,학생}
객체2 : 학교{강의2{교수,학생}

집합관계로 개발하게되면 
강의,교수,학생을 따로 생성하고 주소를 공유한다.
강의1,강의2,교수1,교수2,학생1,학생2,학생3을 생성한다.
강의1 안에 교수1,학생1,학생2의 메모리 주소를 공유한다.
강의2 안에 교수2,학생1,학생2,학생3의 메모리 주소를 공유한다.

이렇게하면 강의1이 없어지더라도 교수1,학생1,학생2의 정보는 남는다.


다만, 분산처리할땐 메모리가 분리되어있어 사용못한다.

 

#include <iostream>

//강의
#include "Lecture.h"
//교수
#include "Teacher.h"
//학생
#include "Student.h"

int main()
{
	using namespace std;
	//다른곳에서 쓰게되면 동적할당으로 사용함.
	Student std1("Jack", 0);
	Student std2("cho", 0);
	Student std3("ahn", 0);

	Teacher t1("t_lee");
	Teacher t2("t_choi");

	Lecture lec1("test1");
	lec1.assignTeacher(&t1);
	lec1.registerStudent(&std1);
	lec1.registerStudent(&std3);

	Lecture lec2("test2");
	lec2.assignTeacher(&t2);
	lec2.registerStudent(&std1);
	lec2.registerStudent(&std2);
	lec2.registerStudent(&std3);

	{
		cout << lec1 << endl;
		cout << lec2 << endl;

		lec1.study();
		cout << lec1 << endl;
		cout << lec2 << endl;


	}
}

구성(요소)Composition 
Part-of 두뇌는 육체의 일부이다.
육체가 없으면 두뇌는 없다

몬스터 클래스에 위치 클래스가 있다고한다면
몬스터가 없어지면 그몬스터의 위치클래스도 없어져야한다.
또, 위치 클래스는 몬스터의 이름을 알지 못한다.

즉, 몬스터 클래스에서 사용된 위치클래스는 그냥 몬스터의 일부이다.

또한 몬스터클래스가 위치클래스의 동작원리를 알 필요가 없다.

Composition 관계는 전체/일부로 생각하면 된다.

몬스터클래스 {(몬스터전체)
위치 클래스 : 몬스터클래스의 정보안에 위치가 존재한다.(몬스터의 일부)
}

 

main.cpp

#include <iostream>
#include "Monster.h"
using namespace std;



int main() {
	//몬스터 정보안에 위치가 들어있다.
	Monster mon1("name", Position2D(0,0));
	mon1.getLocation();
	cout << mon1 << endl;
	Monster mon2("name2", Position2D(0, 0));
	mon2.getLocation();
	{
		mon1.moveTo(Position2D(1, 1));
		cout << mon1 << endl;
	}
	return 0;
}

Monster.h

#pragma once

#include <string>
#include "Position2D.h"

class Monster
{
private:
	std::string m_name;

	//subClass
	Position2D m_location;//m_x,m_y

	//int m_x;//location
	//int m_y;

public:
	//서브클래스로 위치클래스를 사용한다.
	Monster(const std::string name_in, const Position2D & pos_in)
		:m_name(name_in), m_location(pos_in) {

	}
	//set의 원리를 알 수 없다.
	void moveTo(const Position2D & pos_target) {
		m_location.set(pos_target);
	}

	void getLocation () {
		std::cout << m_location << std::endl;
	}


	friend std::ostream & operator << (std::ostream & out, Monster & monster) {
		out << monster.m_name << " " << monster.m_location;
		return out; 
	}
};

Position2D.h

#pragma once
#include <iostream>

class Position2D
{
private:
	int m_x;
	int m_y;

public:
	Position2D(const int & x_in,const int & y_in)
		: m_x(x_in),m_y(y_in)
	{}

	void set(const Position2D & pos_target) {
		set(pos_target.m_x, pos_target.m_y);
	}

	void set(const int & x_in, const int & y_in) {
		m_x = x_in;
		m_y = y_in;
	}

	friend std::ostream & operator << (std::ostream & out, Position2D & position2D) {
		out << position2D.m_x << " " << position2D.m_y;
		return out;
	}
};

+ Recent posts