物語で学ぶオブジェクト指向 〜配列だけで恋愛パーティーをシミュレーション〜
ある日あなたは、友人から突然「10 名限定の恋愛パーティーを手伝ってほしい」と頼まれます。
- 会場には 10 席しかない。
- 参加者からは 名前 と 趣味 しか聞かない。
- パーティー開始時に 名札を配って自己紹介 をしてもらう。
プログラマーのあなたは「せっかくだから C# でシミュレーションしてみよう」と思い立ちます。まだ List やコンストラクタは学び途中。でも 配列・for・if なら使えます。――さぁ、コードで会場を準備しましょう。
第0章 物語の作成
- 恋愛パーティー題材であることが一目で分かるソリューション名(OOPLovePartyArray)で作成しましょう
第 1 章 受付表という“受付リスト”を用意する
受付スタッフの陽子さんが、長机の上に 10 行分の受付リスト用意します。
string[] names = new string[10]; // 受付リストの左列:名前
string[] hobbies = new string[10]; // 受付リストの右列:趣味
// 事前申し込み 2 名が到着
names[0] = "田中"; hobbies[0] = "登山";
names[1] = "佐藤"; hobbies[1] = "ゲーム";
ここでは 受付リスト=配列。10 行は定員そのもの。空欄はまだ来ていない席です。
第 2 章 何人来た? 〜カウント係・健太の作業〜
健太(カウント係)は受付リストを名前が書いてある行だけ数えます。
int count = 0;
for (int i = 0; i < names.Length; i++)
{
if (names[i] != null) count++; // 名前が書かれた行だけ数える
}
Console.WriteLine($"受付完了:{count} 名\n");
ポイント: 配列は 10 行あっても、実際の参加者は書かれている行数だけ。
第 3 章 名札作成ブースとオブジェクト誕生の儀
会場奥にある“名札作成エリア”。ここで初めて Participant という記述する内容から名札が作られ、参加者の胸に貼られます。
Participant.cs
ポイント: Participant
クラスはあくまで“設計図”であり、プログラム実行前にはメモリ上に実体は存在しません。Visual Studio の 「開始」▶ ボタンでコードが動き、new Participant()
が呼ばれた瞬間に初めて「参加者インスタンス」が誕生します。クラス(設計図)とオブジェクト(実体)を明確に区別しましょう。
public class Participant
{
public string Name; // 名札
public string Hobby; // 趣味
public void Introduce()
{
if (string.IsNullOrWhiteSpace(Hobby))
Console.WriteLine($"こんにちは、{Name}です。趣味は特にありません。");
else
Console.WriteLine($"こんにちは、{Name}です。趣味は{Hobby}です。");
}
}
控え室での作業手順
Participant[] members = new Participant[count];
int idx = 0;
for (int i = 0; i < names.Length; i++)
{
if (names[i] == null) continue; // 空席はスルー
members[idx] = new Participant(); // 参加者を生成(new)
members[idx].Name = names[i]; // 名札に名前を書く
members[idx].Hobby = hobbies[i]; // 名札に趣味を書く
idx++;
}
ここが物語のクライマックス:new
を呼んだ瞬間、参加者オブジェクトが生成されメモリ上に実体が誕生します。同時にプログラムはそのオブジェクトに名前と趣味を貼り付け、名札が完成 します。Visual Studio の 「開始」▶ ボタンでコードを走らせるまでは、参加者オブジェクトも名札もメモリ上に存在しません。
第 4 章 自己紹介を始めてもらいます
司会の玲奈さんがマイクを持って宣言します。
Console.WriteLine("パーティーを開始します。自己紹介どうぞ!\n");
foreach (var p in members)
{
p.Introduce();
}
コンソールには次々と挨拶が流れ、会場が温まります。――ここで「これがオブジェクトがメソッドを動かす瞬間なんだ」と実感できるはずです。
第 5 章 デバッグでエラーを解決する
C# で最初につまずくのは例外メッセージ。本編のコードを題材に、3 大エラーをデバッグで解決する手順を体験します。
- NullReferenceException — ブレークポイントで
members[idx]
が null か確認し、生成条件を修正。 - IndexOutOfRangeException — ループ条件を
i < names.Length
に統一。 - 文字化け —
Console.OutputEncoding = Encoding.UTF8;
をMain()
に追加。
値・フロー・メモリの 3 つを見れば 99% のバグは退治できます。
第 6 章 List 版に書き換えて可変人数に対応
var members = new List<Participant>();
for (int i = 0; i < names.Length; i++)
{
if (names[i] == null) continue;
members.Add(new Participant { Name = names[i], Hobby = hobbies[i] });
}
members.ForEach(p => p.Introduce());
Add
1 行で受付完了。Count
も自動管理されます。
第 7 章 Dictionary で名前検索を高速化
var book = members.ToDictionary(p => p.Name);
if (book.TryGetValue("佐藤", out var satou))
{
satou.Introduce();
}
キー検索は O(1)。名前から瞬時にオブジェクトを取得できます。
第 8 章 GUI への一歩 — WinForms で可視化
- TextBox(名前・趣味)を置く。
- [受付] ボタンで List に追加し、ListBox に表示。
- [開始] ボタンで各
Introduce()
を MessageBox か ListBox に流す。
コンソール版と同じ
Participant
クラスを流用できるため、学んだロジックをそのまま GUI へ移植できます。
次のステップへ
デバッグ → List → Dictionary → GUI と進むことで、“動かす→不便→改善” の学習サイクルが身に付きました。次は コンストラクタ、LINQ、ファイル保存 へ挑戦し、あなた自身のアプリを改良してみてください。
ディスカッション
コメント一覧
まだ、コメントがありません