1. はじめに
もう聞いたことあると思うけど、クラスはテンプレートで、オブジェクトはそのインスタンスだよ。
でも、そろそろクラスとオブジェクトについてもっと深く理解しよう!
例えば、自分が自動車工場のエンジニアだと想像してみて。毎回手作業で車を組み立てる代わりに、設計図を作るんだ ― それは同じタイプの車を何台も作れる共通の説明書みたいなもの。その設計図には、車にはエンジンがあって、タイヤがあって、ボディがあって、色があって、どんな機能があるかが書いてある。
この設計図がプログラミングの世界ではクラスって呼ばれてるんだ。
で、その設計図通りに工場が車を何台も作ったとしよう。それぞれの車は実際に道路を走ってて、ナンバーも色も個別に違うし、ちょっとしたカスタマイズもできる。でも全部同じ設計図から作られてるんだよね。
この現実の車たちがプログラミングの世界ではオブジェクト(またはクラスのインスタンス)って呼ばれてる。
じゃあ、まとめると:
- クラス ― 設計図、テンプレート、スキーマみたいなもの。何か(例えばブランド、色、ドアの数)にどんなデータがあるか、何ができるか(例えば走る、止まる、クラクションを鳴らす)を説明するだけ。クラス自体はメモリをほとんど使わないし、「生きてる」ものじゃない。
- オブジェクト ― クラスの設計図から作られた実際の「車」。プログラムの中で「生きてる」実体で、メモリを使ってて、データ(ナンバーや色など)も個別に持ってて、クラスで説明された動作もできる。
ちょっと抽象的に感じる?大丈夫、これからちゃんと説明するよ。
2. クラスって何?
クラスは、ユーザー定義のデータ型で、その型のオブジェクトがどんな見た目になるかを説明するもの。どんな特徴(状態/プロパティ/フィールド)があって、どんな動作(ふるまい/メソッド/関数)ができるかを決めるんだ。
クラスが定義するのは:
- フィールド(変数) ― オブジェクトの中に保存されるデータ。
- メソッド(関数) ― オブジェクトができる動作。
- プロパティ ― データにアクセスするための特別なメソッド。
- イベント ― 通知の仕組み(これは後で説明するね)。
- コンストラクタ ― オブジェクトを作るための特別なメソッド。
public class Person
{
// フィールド(データ)
public string Name;
public int Age;
// メソッド(動作)
public void SayHello()
{
Console.WriteLine($"やっほー!僕の名前は{Name}、{Age}歳だよ。");
}
}
この例ではPersonクラスを宣言してる。フィールドが2つ(NameとAge)、メソッドが1つ(SayHello())。これだけでシンプルなクラスができるよ。
3. オブジェクトって何?
オブジェクトはクラスのインスタンス、つまり「設計図」(クラス)からメモリ上に作られた具体的な実体だよ。
Person型の変数を作ると、オブジェクトができる ― それぞれのフィールドにユニークな値を持てる。ただの「人」じゃなくて、例えば「ジョニー」って名前で12歳の人、みたいな感じ。で、その人が挨拶してくれる(つまりSayHello()メソッドを呼ぶ)と、自分の情報を「教えて」くれるんだ。
// Personクラスのオブジェクトを作る
Person person1 = new Person();
person1.Name = "アリサ";
person1.Age = 28;
person1.SayHello(); // => やっほー!僕の名前はアリサ、28歳だよ。
// もう一人「人」を作る
Person person2 = new Person();
person2.Name = "ボブ";
person2.Age = 32;
person2.SayHello(); // => やっほー!僕の名前はボブ、32歳だよ。
それぞれのオブジェクトはただのコピーじゃなくて、独立した実体で自分だけのデータ(この例だと名前と年齢)を持ってるよ。
4. クラスとオブジェクトの主な違い
主な違い:
- クラス ― 「設計図」、説明書、データ型。
- オブジェクト ― その型の具体的な代表例。「設計図」から作られた本物の「家」や「車」みたいなもの。
同じクラスのオブジェクトは何個でも作れる。例えばPersonクラスがあれば、プログラムの中で「人」を100万個でも作れるよ。
なんでこれが便利で大事なの?
クラスがないプログラムを想像してみて。もし学生のリストを作りたかったら、名前、年齢、成績とかを全部別々の配列で管理しなきゃいけない:
string[] studentNames = { "セルゲイ", "グリシャ", "マーシャ" };
int[] studentAges = { 20, 19, 21 };
// もし新しいプロパティを追加したら、また新しい配列が必要。
// 2人の学生を入れ替えたいだけでも超めんどくさい!
クラスを使えば、データがバラバラにならずに、ちゃんとまとまるんだ:
public class Student
{
public string Name;
public int Age;
}
Student[] students = new Student[3];
students[0] = new Student { Name = "セルゲイ", Age = 20 };
students[1] = new Student { Name = "グリシャ", Age = 19 };
students[2] = new Student { Name = "マーシャ", Age = 21 };
めっちゃ分かりやすいし便利!しかも、各学生にメソッド(例えば「挨拶する」とか「平均点を計算する」とか)も追加できるようになるよ。
図:クラスとオブジェクトの関係
+------------------+ +----------------+
| class Person |=========>| person1: |
| (設計図/型) | | Name = "アリサ"|
| | /| Age = 28 |
+------------------+ / +----------------+
/
+------------------------/----------------------+
/
+----------------+
| person2: |
| Name = "ボブ" |
| Age = 32 |
+----------------+
5. クラスとオブジェクトは現実でどこで使われてる?
クラスとオブジェクトはC#アプリの基本だよ。.NETで見かけるもの全部 ― ウィンドウ、ボタン、フォーム、配列、コレクション、DB接続、ログ ― これ全部、特定のクラスから作られたオブジェクトなんだ。
例:
- Buttonクラス ― 画面上のボタンがどう見えるかの説明書。新しいボタンを作るたびに、それはクラスのオブジェクトになる。
- Streamクラス(入出力システムのやつ):ファイル操作をするオブジェクトがもらえる。
- 自分で作るUserクラス ― ユーザー情報を保存するためのテンプレート。
名前、修飾子、コーディング規約についてちょっとだけ
- クラス名は大文字で始めるのが普通。例えばPerson、Order、Product。
- 変数名は小文字で始めるのが多い。例えばperson、user1、orderList。
- たいていクラスはpublicにして、プロジェクト全体で使えるようにするよ。
GO TO FULL VERSION