FE EXAM

オブジェクト指向設計(データと処理をまとめて設計)

データと処理をオブジェクトとしてまとめて設計する考え方。

DIAGRAM
属性(データ)
操作(処理)
インスタンス
クラス(設計図)Car属性(データ)color = "赤"speed = 0操作(処理)accelerate()brake()生成インスタンス(実体)myCarcolor = "赤"speed = 60taxicolor = "黄"speed = 30buscolor="青"speed=401つのクラスから複数のインスタンスを作れるオブジェクト同士はメッセージで処理を依頼し合う運転手 オブジェクト操作drive()内部の処理は知らなくてよい車 オブジェクト操作accelerate()依頼を受けて処理を実行メッセージ: 「加速して」結果を返す各オブジェクトは「データ+それを扱う操作」を内側に持ち、外からはメッセージだけで使う
解説

📌
オブジェクト指向とは

データと処理を1つの「もの」にまとめるオブジェクトデータ属性処理操作

オブジェクト指向とは、関連するデータ(属性)とそれを扱う処理(操作)を「オブジェクト」という1つのまとまりにして設計する考え方です。オブジェクトとは、現実世界の「もの」をプログラム上に表したものと考えると分かりやすいです。

従来は「データ」と「処理」を別々に書いていました。オブジェクト指向では、たとえば「車」というオブジェクトに、色や速度といったデータと、加速する・止まるといった操作を一緒に持たせます。

身近な例で考えると、テレビのリモコンに似ています。内部の電子回路(データ)は隠したまま、利用者はボタン(操作)を押すだけで使えます。上の図解で、データと処理が1つの箱にまとまっている様子を確認してください。

📌
基本概念

クラス(型)からインスタンス(実体)を作るクラスたい焼きの型=設計図実体1実体2実体3インスタンス(焼いたたい焼き)

オブジェクト指向を理解するうえで、次の3つの言葉が基本になります。


クラス:オブジェクトの設計図。どんなデータ(属性)を持ち、どんな処理(操作・メソッド)ができるかを定義します。「たい焼きの型」にあたります
インスタンス:クラスから実際に作られた実体。型から焼いた1個1個のたい焼きです。1つのクラスからいくつでも作れます
メッセージ:オブジェクトが別のオブジェクトに処理を依頼するための要求。「加速して」と頼むイメージです

クラスの中の処理(操作)のことをメソッド(=オブジェクトが行う処理を書いた関数のこと)とも呼びます。プログラムは、たくさんのオブジェクトがメッセージをやり取りしながら協力して動く、という形で組み立てられます。

📌
利点

部品(オブジェクト)を組み合わせて作る部品A部品B部品C++独立した部品は使い回せて、直すのも一部だけで済む

オブジェクト指向で設計すると、プログラムが独立した部品(オブジェクト)の集まりになります。これにより、大きく次のような利点が生まれます。


再利用しやすい:一度作ったクラスを別のプログラムでもそのまま使い回せます
保守しやすい:1つのオブジェクトを直しても他に影響が及びにくく、修正範囲が小さく済みます
分担しやすい:オブジェクトごとに担当を分けて開発でき、大規模開発に向いています
現実世界に対応づけやすい:「車」「顧客」など現実の「もの」をそのまま設計に写せるため理解しやすいです

身近な例で考えると、レゴブロックのようなものです。1つ1つは独立した部品ですが、組み合わせることで自由に大きな作品を作れます。1個のブロックを取り替えても全体を作り直す必要はありません。これがオブジェクト指向の便利さです。

📌
カプセル化・継承・多態性の関係

カプセル化データを隠す外から触れない継承親の機能を子が引き継ぐ多態性同じ操作でも種類で動き変わる親クラス: 動物子: 犬子: 猫

オブジェクト指向には3つの重要な考え方があります。それぞれを押さえると、「なぜ便利なのか」がより深く理解できます。

カプセル化(=データを内側に閉じ込めること):オブジェクトの内部のデータを外から直接いじれないようにします。操作(メソッド)を通じてだけ使えるので、「中身を知らなくても使える」状態になります。テレビのリモコンの内部回路は触れなくても、ボタンで操作できるのと同じ仕組みです
継承(=親クラスの機能を子クラスが引き継ぐこと):「動物」クラスを作っておき、「犬」クラスはそれを引き継いで「吠える」という独自の機能だけ追加できます。共通部分を1か所にまとめられるので、同じ内容を何度も書かなくてよくなります
多態性(ポリモーフィズム=同じ操作でも種類によって動きが変わること):「鳴け」という同じ命令を送っても、犬は「ワン」、猫は「ニャー」と返します。呼び出す側は種類を気にせず同じ書き方でよく、プログラムがシンプルになります

3つは独立した機能ではなく、組み合わせて使うことで力を発揮します。カプセル化で安全に閉じ込め、継承で共通部分を使い回し、多態性で柔軟に動かす、という流れです。

📌
なぜクラスとインスタンスに分けるのか

クラス(型)属性: 色, 速度操作: 走る()生成myCar赤/60走る()taxi黄/30走る()bus青/40走る()1つだけ何個でも作れる型は1つ = 設計を1か所に集約。実体は何個でも作れる

なぜクラスとインスタンスを分けるのか。答えは「設計を1か所にまとめることで、何個でも簡単に作り出せるようにするため」です。

たとえば、車工場のたとえを考えてみましょう。
クラス(型)は「設計図と金型を1つ持つ」だけです。修正が必要なら設計図を直すだけで、以後作る車すべてに反映されます
インスタンス(実体)は「その型から焼いた1台ずつの車」です。色や速度は1台ごとに違う値を持てます
・クラスは「同じ種類のものの共通ルール」、インスタンスは「そのルールを持った具体的な1個」です

プログラムでは、1つのクラスから何個でもインスタンスを作れます。上の図のように、myCartaxibusはすべて同じ Car クラスから作られた別々の実体です。色や速度の値は違いますが、「走る」という操作を全員が持っています。

練習問題

🎯
基本情報技術者 練習問題

Q1.オブジェクト指向の説明として最も適切なものはどれか。
A.データ(属性)と処理(操作)を1つのオブジェクトとしてまとめて設計する考え方
B.プログラムを上から順に1本道で実行する考え方
C.データだけを集めて1つのファイルに保存する考え方
D.処理だけを関数として並べる考え方
Q2.クラスとインスタンスの関係を説明したものとして適切なものはどれか。
A.インスタンスはクラスの設計図であり、クラスはそれを実際に作った実体である
B.クラスは設計図であり、インスタンスはその設計図から作られた実体である
C.クラスとインスタンスはまったく同じものを指す言葉である
D.クラスは1つしか作れないが、インスタンスは複数の設計図を持てる
Q3.オブジェクト同士が処理を依頼し合うために送る要求を何と呼ぶか。
A.インスタンス
B.クラス
C.メッセージ
D.コンパイル

関連コンテンツ