10.2 구성관계

보물창고·2021년 8월 11일
0

구성 관계란?

: 클래스 작성 중에 다른 객체에서도 사용할 것 같은 구성품을
클래스로 뺀 후, private 공간에 두는 것을 말한다.

예를 들어 게임에서 고블린, 슬라임 등의 몬스터가 있는데,
좌표를 나타내는 x,y값을 Position이라는 클래스에 따로 놓고
몬스터들의 클래스에서는 하나의 부품 형식으로 사용하도록 private 멤버에다가 놓는 것이다.

상속 클래스로 만들어 놓으면 되지 않을까? 라는 생각을 했다.

class Parent
{
	protected :
    int x;
    int y;
    virtual void Walk() = 0;
    
}

-> 이런식으로 하지만!! 밑의 내가 정리한 내용을 참고하면 관련되지 않은 몬스터 타입이 온다면 해당 몬스터에서 멤버 변수를 따로 정리해야 하므로,
따로 클래스를 만들어서 사용하는 것이 효율적이고, 이를 구성관계라고 한다.
부품이라고 생각하면 이해된다!

https://velog.io/@kwt0124/%EC%88%9C%EC%88%98-%EA%B0%80%EC%83%81%ED%95%A8%EC%88%98

예시


: 고블린의 좌표 x,y가 있는데, 슬라임도 위치를 나타내는 좌표를 가지고 있어야한다. 공통적인 부분이므로 이를 하나의 부품으로 여기고, 클래스로 만들어 준후, 멤버 변수로 사용하면 효율적이다!

  • 코드 변경하기

    : Position 클래스를 만들었고, 멤버 변수로 사용하자.

  • 최종 코드
#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Position
{
private :
	int mX;
	int mY;
public : 
	Position(const int&inX, const int&inY)
		: mX{ inX }, mY{inY}
	{}
	void SetPosition(const Position& InPos)
	{
		mX = InPos.mX;
		mY = InPos.mY;
	}
	friend std::ostream & operator << (std::ostream & out, const Position & pos2d)
	{
		out << pos2d.mX << " " << pos2d.mY;
		return out;
	}
};

class Goblin
{
private :
	string mName;
	Position mLocation;
public : 
	Goblin(const string &inName, const Position&inPos)
		:mLocation{ inPos }, mName{inName}
	{}
	void MoveTo(const Position &nextPos)
	{
		mLocation.SetPosition(nextPos);
	}
	friend std::ostream &operator << (std::ostream &out, const Goblin &gob)
	{
		out << gob.mName << " " << gob.mLocation;
		return out;
	}
};

int main()
{
	Goblin gob("고블린", Position(4,0));
	cout << gob << endl;

	{
		gob.MoveTo(Position(1, 1));
		cout << gob << endl;
	}
}
profile
🔥🔥🔥

0개의 댓글