Javaプログラミング入門
13. オブジェクト指向
最終更新:
javatutorial
-
view
プログラミングを学ぶ上で、オブジェクト指向という考え方は非常に重要な概念です。
これまでに学習したメソッドやパッケージなどの知識を基に、プログラムをより効率的に、そして理解しやすく作るための新しい考え方を学んでいきましょう。
これまでに学習したメソッドやパッケージなどの知識を基に、プログラムをより効率的に、そして理解しやすく作るための新しい考え方を学んでいきましょう。
オブジェクト指向とは何か
オブジェクト指向とは、現実世界の「もの」や「概念」をプログラムで表現する考え方です。
私たちの身の回りにあるすべてのものは「オブジェクト」として捉えることができます。
私たちの身の回りにあるすべてのものは「オブジェクト」として捉えることができます。
例えば、スマートフォンを考えてみてください。
スマートフォンには以下のような特徴があります
スマートフォンには以下のような特徴があります
- 属性(特徴・性質)
色、サイズ、メーカー、電池残量、画面の明るさなど
- 動作(できること)
電話をかける、メールを送る、写真を撮る、音楽を再生するなど
オブジェクト指向プログラミングでは、このような現実世界の「もの」をプログラムの中で表現し
それらを組み合わせてより大きなシステムを作っていきます。
それらを組み合わせてより大きなシステムを作っていきます。
従来のプログラミング方法との違い
これまで学習してきたプログラミング方法を手続き型プログラミングと呼びます。
手続き型プログラミングでは、処理の手順を上から下へと順番に記述していきます。
手続き型プログラミングでは、処理の手順を上から下へと順番に記述していきます。
例えば、学生の成績を管理するプログラムを手続き型で作ると以下のようになります
- public class GradeManagement {
- // 学生の情報を個別の変数で管理
- int student1Math = 85;
- int student1English = 92;
- int student1Science = 78;
-
- int student2Math = 90;
- int student2English = 88;
- int student2Science = 95;
-
- // 平均点を計算
- double student1Average = calculateAverage(student1Math, student1English, student1Science);
- double student2Average = calculateAverage(student2Math, student2English, student2Science);
-
- // 結果を表示
- displayResult(student1Name, student1Average);
- displayResult(student2Name, student2Average);
- }
-
- public static double calculateAverage(int math, int english, int science) {
- return (math + english + science) / 3.0;
- }
-
- }
- }
実行結果
田中太郎の平均点: 85.0
佐藤花子の平均点: 91.0
この方法でも動作しますが、学生の数が増えると変数の数が膨大になり、管理が困難になってしまいます。
また、学生に関する情報が散らばってしまい、どの変数がどの学生のものかを把握するのが大変になります。
また、学生に関する情報が散らばってしまい、どの変数がどの学生のものかを把握するのが大変になります。
オブジェクト指向の考え方
オブジェクト指向では、関連する情報と処理をひとまとめにして考えます。
先ほどの例で言えば、「学生」という概念をひとつのオブジェクトとして捉えます。
先ほどの例で言えば、「学生」という概念をひとつのオブジェクトとして捉えます。
「学生」オブジェクトには以下のような要素があります:
属性(データ・特徴)
- 名前
- 数学の点数
- 英語の点数
- 理科の点数
動作(メソッド・機能)
- 平均点を計算する
- 成績を表示する
- 合格判定をする
このように、関連する情報と処理をひとつにまとめることで、プログラムがより整理され、理解しやすくなります。
身近な例でオブジェクト指向を理解しよう
自動車
属性(特徴・データ)
- メーカー(トヨタ、ホンダなど)
- 車種(プリウス、フィットなど)
- 色(赤、青、白など)
- 燃料残量
- 速度
- エンジンの状態(動いている/止まっている)
動作(できること・メソッド)
- エンジンをかける
- 走る
- 止まる
- 曲がる
- ライトを点ける
- クラクションを鳴らす
現実世界では、私たちは自動車の内部構造を詳しく知らなくても、ハンドルを回せば曲がり、ブレーキを踏めば止まることを知っています。
オブジェクト指向でも同様に、内部の複雑な仕組みを隠して、簡単な操作で使えるようにします。
オブジェクト指向でも同様に、内部の複雑な仕組みを隠して、簡単な操作で使えるようにします。
電子レンジ
電子レンジも良い例です。
属性(特徴・データ)
属性(特徴・データ)
- メーカー
- 容量(何リットル)
- 現在の時間設定
- 現在の出力設定
- ドアの状態(開いている/閉まっている)
- 動作状態(加熱中/停止中)
動作(できること・メソッド)
- 時間を設定する
- 出力を設定する
- 加熱を開始する
- 加熱を停止する
- ドアを開ける
- 終了音を鳴らす
電子レンジを使うとき、私たちは内部でマイクロ波がどのように食品を温めているかを知る必要はありません。
ボタンを押すだけで温めることができます。
これがオブジェクト指向のカプセル化という考え方です。
ボタンを押すだけで温めることができます。
これがオブジェクト指向のカプセル化という考え方です。
オブジェクト指向の三大要素
オブジェクト指向プログラミングには、三つの重要な考え方があります。
カプセル化
関連するデータと処理をひとまとめにし、外部からは必要な部分だけを見せる考え方です。
薬のカプセルを想像してください。
カプセルの中には薬の成分が入っていますが、私たちはカプセルの中身を直接触ることはできません。
決められた方法(飲む)でのみ薬を摂取できます。
薬のカプセルを想像してください。
カプセルの中には薬の成分が入っていますが、私たちはカプセルの中身を直接触ることはできません。
決められた方法(飲む)でのみ薬を摂取できます。
プログラムでも同様に、オブジェクトの内部データを直接変更させず、決められたメソッドを通してのみ操作できるようにします。
これにより、データの整合性が保たれ、予期しない変更を防ぐことができます。
これにより、データの整合性が保たれ、予期しない変更を防ぐことができます。
継承
既存のオブジェクトの特徴を受け継いで、新しいオブジェクトを作る考え方です。
動物の分類を考えてみましょう
動物の分類を考えてみましょう
- 「動物」という大きなカテゴリがあります
- 「哺乳類」は動物の特徴を受け継ぎ、さらに独自の特徴を持ちます
- 「犬」は哺乳類の特徴を受け継ぎ、さらに犬独自の特徴を持ちます
プログラムでも、基本的な機能を持つオブジェクトを作り、それを基にしてより特化した機能を持つオブジェクトを作ることができます。
これにより、同じコードを何度も書く必要がなくなり、効率的にプログラムを作成できます。
これにより、同じコードを何度も書く必要がなくなり、効率的にプログラムを作成できます。
ポリモーフィズム
同じ名前の処理でも、オブジェクトによって異なる動作をする考え方です。
「鳴く」という動作を考えてみましょう
「鳴く」という動作を考えてみましょう
- 犬は「ワンワン」と鳴きます
- 猫は「ニャーニャー」と鳴きます
- 牛は「モーモー」と鳴きます
同じ「鳴く」という動作でも、動物によって実際の鳴き方は異なります。
プログラムでも、同じメソッド名でオブジェクトによって異なる処理を実行させることができます。
プログラムでも、同じメソッド名でオブジェクトによって異なる処理を実行させることができます。