オブジェクト指向
-オブジェクトとクラス-

■オブジェクト

オブジェクトとは抽象的なモノに対して名前や種類などの
具体的な情報を与えたモノのことです。

	抽象:
		別々のモノから共通点を抜き取ったモノのこと

		例:
			人、猫、犬、車、バイク、映画

	pgtheory_0034

■オブジェクトの抽象化

「山田さん」や「佐藤さん」などの具体的な各個人(オブジェクト)は
「人」というものに抽象化できます。
このような抽象化は「人」に限らず「車」や「猫」などの
具体性を持ったモノ(オブジェクト)に対して行うことができます。

●オブジェクトの情報
	オブジェクトを抽象化するにはそのオブジェクトの共通情報を
	抜粋する必要があります。

	pgtheory_0035

●オブジェクトの行動(機能)
	抽象化するオブジェクトは情報に限らず行動(機能)に関しても
	共通情報の抜粋を行います。

	pgtheory_0039

●抽象化の有用性
	オブジェクトを抽象化したモノ(人など)を作成することで
	オブジェクトを作る際の効率が上がります。
	なぜなら「人」というオブジェクトを抽象化するために
	「人」を形成する情報を集めました。
	あとはその情報に具体的な内容を設定するだけで
	「山田」や「佐藤」「鈴木」といった様々な人オブジェクトを作成できます。

	pgtheory_0036

■クラス

オブジェクトを抽象化した存在は「クラス」として扱うことができます。
以下はロボットをクラス化した内容です。

	ロボットを抽象化するための情報、機能
		情報:
			製造番号
			名称
			製造日
			身長
			重量
			エネルギー残量

		機能:
			思考
			自立行動
			充電

	クラス化
		class Robot
		{
			// 情報
			int m_Number;		// 製造番号
			char m_Name[64];	// 名称
			char m_CreateDate[64];	// 製造日
			int m_Height;		// 身長
			int m_Weight;		// 重量
			float m_Energy;		// エネルギー残量

			// 機能
			void Ai(void);		// 思考
			void Move(void);	// 移動
			void Charge(void);	// 充電
		};

■インスタンス

上記でRobotをクラス化しましたが、これはオブジェクトではありません。
なぜならこのクラスは必要な情報、機能を集めただけで、
その中に具体的な情報が一切入っていないからです。
このクラスをオブジェクトとして扱うためには
クラスを実体化する(新しく作る)必要があります。
その実体化したクラスをインスタンスと呼び、
実体化する行為をインスタンス化と呼びます。

例:
	class Robot
	{
	public:	
		// 情報
		int m_Number;		// 製造番号
		char m_Name[64];	// 名称
		char m_CreateDate[64];	// 製造日
		int m_Height;		// 身長
		int m_Weight;		// 重量
		float m_Energy;		// エネルギー残量

		// コンストラクタ
		Robot(){}

		// 機能
		void Ai(void);		// 思考
		void Move(void);	// 移動
		void Charge(void);	// 充電
	};

	void main(void)
	{
		// Robotクラスを実体化する => インスタンス化
		Robot *robot = new Robot();

		/*
			インスタンス化したRobotクラスに具体的な情報を与えて
			オブジェクトとして使用する
		*/
		robot->m_Number = 10001;
		strcpy(robot->m_Name, "ガンダ○");
		strcpy(robot->m_CreateDate, "3000-04-07");
	}