はじめに#
オブジェクト指向について、講師役として解説する機会があるため、 振り返りとしてオブジェクト指向を再学習する。
オブジェクト指向とは?#
- データと関連する処理を「オブジェクト」という単位にまとめて管理するソフトウェア開発手法
- オブジェクトは、クラスから生成される実体(インスタンス)
- (一部のプログラミング言語(Python、Rubyなど)ではクラス自体もオブジェクトとして扱われるが、このメモではオブジェクト=インスタンスとする)
オブジェクト指向が誕生した経緯#
- 1960~1970年代は「手続き型プログラミング」が主流。
- データと処理を別々で記述する手法で、各データや処理のコーディングに集中できる反面、プログラムが大規模化すると、データと処理の関係性を把握するのに多大なエネルギーを必要としていた。
- 構造化プログラミングは制御構造(順次・選択・反復)を整理する手法として同時期に発展したが、データと処理の管理については別の課題として残っていた。
- この問題を解決するために「データ」と「処理」をまとめて管理する「オブジェクト」が誕生。このオブジェクトの管理に主眼を置いたのがオブジェクト指向である。
クラス・インスタンス#
オブジェクト指向を成立させるための基本的な概念がクラスとインスタンス
- クラス:設計図やテンプレート
- インスタンス:クラスから生成される実体(オブジェクト)
車で例えると、設計図から車を製造するようなイメージ
- クラス:車の設計図
- インスタンス:製造された車
基本用語#
オブジェクト指向を理解する上で重要な基本用語を説明します。
プロパティ(属性)#
- オブジェクトが持つデータ・状態を表す変数
- 車の例:色、速度、走行距離、燃料残量など
- 例:
car.color = "red"(車の色は赤)
メソッド#
- オブジェクトができる動作・処理を表す関数
- 車の例:走る、止まる、クラクションを鳴らす、給油するなど
- 例:
car.drive()(車を運転する)
コンストラクタ#
- オブジェクトを生成する際に初期化処理を行う特別なメソッド
- 新しい車を製造する際の初期設定のようなもの
- 車の例:製造時に色、エンジンタイプ、シート数などを設定
- 例:
car = Car("red", "hybrid", 5)(赤いハイブリッド5人乗りの車を作る)
オブジェクト指向の3大要素#
- 継承
- カプセル化
- ポリモーフィズム
クラスとインスタンスを使って上記の3要素が実現できる。
継承#
親クラスから内容を引き継いで新しい子クラスを作成する。
例えば、親クラスとして「車」があるとした場合、子クラスとして「乗用車」「トラック」「バス」を設定可能。 さらに「乗用車」から「タクシー」や「パトカー」を作ることもできる。 このとき、「トラック」には「荷物を積む」、「バス」には「乗客を乗せる」などの個別機能を実装できる。
カプセル化#
データと処理を外部から隠蔽して保護する機能
車の例を引き続き利用すると、「車の走行距離記録(オドメーター)」がある。 このオドメーターは手動でいじることは違法行為にあたる。走行距離をしっかり測定する必要があるので、 「車の走行距離記録(オドメーター)」に対して、直接アクセスできないようにして、「車で運転」した場合のみ 「オドメーター」に追加するようにする。この処理をカプセル化で実現できる。
ポリモーフィズム#
同じ命令で、対象によって異なる動作をする機能
車の例:「サイレンを鳴らす」という同じ命令でも
- パトカー → 「ウーウー」
- 救急車 → 「ピーポーピーポー」
- 消防車 → 「ウーカンカン」
それぞれ違う音が鳴る。
これが便利な理由は、「サイレンを鳴らす」という共通の命令を覚えるだけで、 車種ごとの細かい違いを意識せずに使えることである。
オブジェクト指向のメリット・デメリット#
メリット#
再利用しやすい
- 一度作った「車」クラスから、何台でも車を作れる
修正が楽
- 「車」クラスを修正すれば、全ての車に反映される
現実世界に近い
- 車、人、建物など、身近なモノとして考えられる
デメリット#
小さなプログラムには大げさ
- 簡単な計算だけなら、クラスなしの方が早い
最初は難しい
- 概念の理解に時間がかかる
設計ミスの影響が大きい
- クラスの作り方を間違えると、大幅な修正が必要
まとめ#
オブジェクト指向#
データと関連する処理を「オブジェクト」という単位にまとめて管理するソフトウェア開発手法
クラスとインスタンス#
- クラス:設計図・テンプレート
- インスタンス:クラスから生成された実物
オブジェクト指向の3大要素#
- 継承:既存のクラスを拡張して再利用
- カプセル化:データと機能をまとめて、外部から保護
- ポリモーフィズム:同じ操作で異なる振る舞い
さらに深く学ぶために#
オブジェクト指向開発の初期に活躍した「アラン・ケイ」によるオブジェクト指向の解説を読むと オブジェクト指向について深掘りできると思います。内容が難しいので、このメモでは詳細にまとめないが、参考としてリンクを紹介します。
- note:アラン・ケイのオブジェクト指向プログラミング
- Dr. Alan Kay on the Meaning of “Object-Oriented Programming”
- Qiita:アラン・ケイのオブジェクト指向とは何だったか?元哲学者のエンジニアがまとめてみた
参考資料#
- いちばんやさしい基本情報技術者 絶対合格の教科書+出る順問題集
- 著者:高橋 京介
- 出版社:SBクリエイティブ
- 出版年:2024年
- Qiita:[Python] Pythonでオブジェクト指向を完全理解してみる