前回まで、クラス(設計図)に、データと処理を持たせてきました。

今回は、設計図から作る「実物」、インスタンスの話です。これまで new で作ってきたもの、その正体です。

インスタンスとは、クラス(設計図)から作られた「実物」のことです。

これまで作ってきた「実物」のこと

第18回から、こう書いてきました。

Person taro = new Person();

この new Person() で作られた taro。これがインスタンスです。新しい言葉ですが、やってきたことそのものなので、心配いりません。

整理すると、

  • クラス … 設計図(Person
  • インスタンス … 設計図から作った実物(taro

たい焼きでいえば、型がクラス、焼きあがったたい焼き1個1個がインスタンスです。

ひとつの設計図から、たくさんの実物

インスタンスの大事な性質は、ひとつの設計図から、いくつでも作れることです。そして、それぞれが独立していること。

Person taro = new Person();
taro.Name = "山田";
taro.Age = 20;

Person hanako = new Person();
hanako.Name = "田中";
hanako.Age = 25;

tarohanako、同じ Person の設計図から作りましたが、中身は別々です。

Console.WriteLine(taro.Name);     // 山田
Console.WriteLine(hanako.Name);   // 田中

taro の名前を変えても、hanako には影響しません。たい焼きと同じで、ひとつにあんこを足しても、別のたい焼きは変わらない。それぞれが独立した実物なんです。

「設計図」と「実物」を、はっきり分ける

ここで、第18回でも触れた区別を、もう一度はっきりさせます。

class Person { ... }              // 設計図(1つ)

Person a = new Person();          // 実物①
Person b = new Person();          // 実物②
Person c = new Person();          // 実物③

設計図は1つ。でも、実物(インスタンス)は何個でも作れる。

設計図そのものには、データは入っていません。「人は名前を持つ」と決めてあるだけ。実際の名前(山田、田中)は、インスタンスごとに持ちます。

この「設計図は共通、データはインスタンスごと」という感覚が、オブジェクト指向の土台です。

なぜ、わざわざインスタンスを作るのか

「最初から変数で持てばいいのでは?」と思うかもしれません。インスタンスの利点は、同じ種類のものを、まとめて・きれいに扱えることです。

たとえば、たくさんの人を List で管理できます。

List<Person> people = new List<Person>();

people.Add(taro);
people.Add(hanako);

foreach (Person p in people)
{
    Console.WriteLine(p.Name);   // 山田、田中…
}

第12回でやった List と、第13回の foreach が、ここで活きます。Person のインスタンスを、まとめて管理する。バラバラの変数では、こうはいきません。

現実のもの(人、商品、注文…)をクラスにして、そのインスタンスを List でまとめる。これが、実際のプログラムでよく使われる形です。連載でやってきたことが、ここで繋がります。

つまずきポイント

初心者がはまるのが、new を忘れることです。

Person taro;          // 名前だけ。まだ実物がない
taro.Name = "山田";   // 実物がないのに、さわろうとしてエラー

Person taro; は、「taro という名前の箱を用意する」と宣言しただけ。まだ中身(実物)はありません

Person taro = new Person();   // new して、初めて実物ができる
taro.Name = "山田";           // これで使える

第12回の List でも「new してから使う」と出てきましたね。同じです。「実物が必要なら、new する」。これはオブジェクト指向の基本動作です。

まとめ

インスタンスは、クラス(設計図)から作られた実物。

Person taro = new Person();   // インスタンスを作る
Person hanako = new Person(); // 別のインスタンス
  • クラスは設計図(1つ)、インスタンスは実物(何個でも)
  • インスタンスは、それぞれ独立している
  • List と組み合わせて、まとめて管理できる
  • 実物が必要なら、必ず new する

次回は、インスタンスを作るときに、初期設定をまとめてやる コンストラクタ を紹介します。