3分間プログラミング講座 第2回: 「設計図」から生まれる「個性」~オブジェクトの独立性~
登場人物:
チャット先生(通称:先生): オブジェクト指向マスター。普段は優しく、たまにユーモアも交えながら解説。
ボット助手(通称:ボット君): プログラミングを始めたばかりの若手。素朴な疑問を投げかけるのが得意。
ボット君: 先生!この間教えてもらった「クラスが設計図で、オブジェクトがそこから作られたモノ」っていうのが、なんだかすごくしっくりきました!特に、同じ設計図から作られた車なのに、それぞれ違う動きをするのが面白かったです!
先生: よかったね、ボット君!まさにそこがオブジェクト指向の醍醐味なんだ。前回は少し触れたけど、今日はその「オブジェクトの独立性」について、もっと深く掘り下げていこう。
ボット君: はい!お願いします!
オブジェクトは「個別のモノ」、データは「それぞれの引き出し」
先生: 前回の例で、Carというクラス(設計図)から「赤いトヨタの車」と「青いホンダの車」という2つのオブジェクト(実体)を作ったのを覚えているかな?
ボット君: はい!redCarとblueCarですね!
先生: そうだね。この2つのオブジェクトは、どちらもCarという同じ設計図から作られている。でも、redCarが加速してもblueCarの速度は変わらなかった。なぜだと思う?
ボット君: うーん……えっと、それぞれが別々に作られたから、ですか?
先生: その通り!素晴らしい!プログラミングの世界では、クラスからオブジェクトを新しく作ると、そのオブジェクトのデータ(属性)のために「専用のメモリ領域」が確保されるんだ。
ボット君: 専用のメモリ領域?
先生: うん。例えば、君が新しい引き出し付きの机を買ったとする。同じデザインの机でも、君の机には君のペンやノート、隣の人の机にはその人の文房具が入っているよね?それぞれが別々の引き出しを持っているから、君が自分の引き出しに何か入れても、隣の人の引き出しには影響しない。
ボット君: あ、なるほど!僕の机と先生の机は同じデザイン(クラス)だけど、中の引き出し(データ)は別々ってことか!
先生: そういうこと!さらに言うと、机の「使い方の説明書」(メソッド)は同じものを参考にするけど、実際に引き出しを開けるときは、自分の机の引き出しだけを開けるよね?プログラムでも同じで、メソッドは共通だけど、操作するデータはそれぞれのオブジェクト固有なんだ。
メソッドは「共通のマニュアル」、thisは「自分の引き出し」
先生: じゃあ、もう一つ質問だ。accelerate()やbrake()といったメソッド(行動)は、redCarもblueCarも同じコードを使っているよね?これはどうしてだと思う?
ボット君: えっと……設計図に書いてあるから、ですか?
先生: 大正解!メソッドのコード(「行動の手順」)は、同じクラスから作られたすべてのオブジェクトで共有されているんだ。だから、redCarもblueCarも、同じaccelerate()メソッドのコードを使って動作するんだよ。
ボット君: なるほど!でも、さっきの「自分だけのデータ」っていう話とどうつながるんですか?説明書が同じなのに、なぜ違う車が動くんですか?
先生: そこがポイントだね!ここで前回のthisが活躍するんだ。
先生: 説明書(メソッド)は共通だけど、その説明書を「誰が読むか」で結果が変わる。redCarがaccelerate()メソッドを呼ぶとき、メソッドの中のthis.speedは「今、赤い車の持っている速度」を指す。blueCarがaccelerate()を呼ぶときは、「今、青い車の持っている速度」を指すんだ。
ボット君: あああ!だから、メソッドのコード自体は一つでも、thisを使うことで、そのメソッドを実行している「自分自身のオブジェクトのデータ」だけを操作できるんですね!
先生: その理解で完璧だ!オブジェクト指向では、このように「データ(属性)」と「それを操作する行動(メソッド)」をセットにして、個別の「オブジェクト」として扱う。これにより、それぞれのオブジェクトが独立した「個性」を持つことができるんだ。
オブジェクトの独立性のメリット
先生: この「オブジェクトの独立性」が、プログラミングにおいてどんなメリットをもたらすと思う?
ボット君: えーと、例えば、たくさんの車をプログラムで扱いたい時に、全部バラバラに書かなくて済むから、楽、とかですか?
先生: その通り!まさにそれも大きなメリットの一つだね。
先生: 例えば、こんな風に複数の車を簡単に作って管理できるんだ。
Java
// 複数のオブジェクトを作成(それぞれが独立したメモリ領域を持つ)
Car car1 = new Car("赤", "トヨタ");
Car car2 = new Car("青", "ホンダ");
Car car3 = new Car("白", "日産");
// それぞれが独立して動作(他に影響しない)
car1.accelerate(50); // 赤いトヨタだけが加速
car2.accelerate(30); // 青いホンダだけが加速
car3.brake(); // 白い日産だけが停止
ボット君: わあ!同じコードパターンで、いろんな車を作れるんですね!
先生: そうだね。主なメリットは以下の3つだよ。
コードの再利用性: 一度Carクラスという設計図を作れば、何台でも好きなだけ車(オブジェクト)を作れる。コードの重複が減るね。
管理のしやすさ: それぞれのオブジェクトが独立しているから、一つのオブジェクトのデータが変わっても、他のオブジェクトに意図しない影響を与える心配が少ないんだ。
役割の明確化: 「この車はこういうデータを持ってて、こういう動きをする」と、一つ一つの「モノ」の役割がはっきりするから、プログラム全体が分かりやすくなる。
ボット君: なるほど!たくさんのモノを効率的に、そして安全に扱えるようになるんですね!オブジェクト指向って、すごく理にかなってるんだなぁ。
今日のまとめ!
オブジェクトの独立性:クラスから作られた個々のオブジェクトは、それぞれ専用のメモリ領域を持ち、独立したデータ(属性)を保持する。
メソッドの共有性:同じクラスのオブジェクトは、同じメソッド(行動の手順)のコードを共有しているが、実行時は各オブジェクト固有のデータを操作する。
thisの役割:共有されるメソッド内で、thisを使うことで、そのメソッドを実行している「自分自身のオブジェクトのデータ」を正確に操作できる。
メリット:コードの再利用性が高まり、管理がしやすくなり、プログラム全体の役割が明確になる。
ボット君: 先生、今日は「独立した個性を持つオブジェクト」について、すごくよく分かりました!自分のデータを持つからこそ、同じメソッドを呼んでも、それぞれの「モノ」が違う動きをするんですね!
先生: その調子だ、ボット君!オブジェクト指向の魅力が少しずつ見えてきたんじゃないかな?次回は、これらの独立したオブジェクトを効率的に設計するための重要な考え方について話そう。「一つのクラスに何でもかんでも詰め込んでしまったら、どんな問題が起きるかな?」例えば、Carクラスに「走る」「止まる」だけじゃなく、「音楽を再生する」「ナビゲーションする」「エアコンを操作する」なども全部入れてしまったら…?ヒントは「責任の分担」だよ!
ボット君: 責任の分担!なんだか難しそうだけど、楽しみです!ありがとうございました!
次回:第3回: 設計の道しるべ~単一責任の原則とクラスの分割~
いいなと思ったら応援しよう!
もしこの記事が少しでも役に立ったり、楽しんでいただけたりしたら、チップをいただけるととても嬉しいです!
いただいたチップは、今後のより良いコンテンツ制作のための書籍代📚とnote購入🗒️、他の方へのチップ代💰に使わせていただきます。
いつも応援ありがとうございます!