オブジェクト指向をざっくりいうと、プログラムを作成するための概念です。
オブジェクト指向を意識してプログラミングすると、システムに必要な仕組みを理解できます。
概念と機能の具体例を見て、オブジェクト指向のコツを掴んでいきましょう。
最初は画像をまとめて流し読みする程度で大丈夫です。
オブジェクト指向の全体像がまとまってきたら・必要になれば文章を見るくらいで丁度良いかと。
ITの基本は下の記事をご覧ください。
オブジェクト指向の概要
オブジェクト指向(Object-Oriented / OOP)は、モノや事柄をオブジェクトとしてプログラミングする概念の1つです。
ふわっと例えるならば、現実にあるモノ・事柄をシステムに落とし込むための概念ともいえます。
???
最初はなんとな~く全体像を見ていきましょう
何度も見返して、全体像→詳細の順番で理解を深めると
脳が勝手に理解してくれます
一度に理解できるモノではないんだね
ゆっくり覚えていこうと思うよ
ちなみにChatGPTさんに聞くと下記が返ってきました。
オブジェクト指向とは
プログラミングのパラダイムの一つで、現実世界の事物や概念をオブジェクトとしてモデル化し、それらのオブジェクト間の相互作用によってプログラムを構築する手法
初見でコレ聞いたらプログラミング嫌いになりそう。
具体例
例として、四則演算ができる電卓システムを作成したいとします。
電卓システムのオブジェクト
・四則演算の機能
・結果を画面表示する機能
・計算結果の履歴を保存する機能
大半のシステムは機械で問題を解決するために開発されます。
一例として、電卓であれば『自動で計算してほしい』という目的がありますよね。
(抽象的)
計算を機械化したいなぁ
四則演算ができるシステム欲しい
四則演算だけ実装すれば良いかな?
(具体的)
実装する必要がある機能は四則演算だけではないですね
四則演算、エラー処理、入力機能、計算結果の画面表示機能
などもありますよ
抽象的な概念から具体的な実装方法を思考・システム化するためにオブジェクト指向は必要です。
目的『四則演算』のシステムがあったとして、実装する機能は多数あります。
目に見えない部分を実体化させないといけません。
そんなたくさんの機能をとりこぼさずに実装するためにも、オブジェクト指向は重要なのです。
オブジェクトについては後述で詳細をご紹介しています。
一旦、「は~、そんな名前のオブジェクトがあるんだなぁ」程度に捉えていただければOKです。
オブジェクト指向のメリット
システム開発の目的が明確になる所です。
あくまでシステムは特定の問題解決のための道具です。
目的の必要条件を満たさないシステムはよろしくありません。
個人の趣味で開発などは別ですよ
もしも『四則演算の計算結果が知りたい』という問題の解決が目的の場合、
『入力された四則演算を処理して表示するシステム』を作成すればOKです。
一方、『必要条件を満たさない・目的とは無関係のシステム』を開発していたらおかしいですよね。
『問題解決を目的としたシステム開発』と『開発者が作成したいシステム開発』は違います。
その目的と開発者側のズレを出さないためにも、オブジェクト指向は大切です。
オブジェクト指向のデメリット
理解し辛い & 学習コストが高すぎる点です。
概念を理解するのは大変難しい事なので、詳細に習得するまで時間がかかります。
今回は初心者さん向けに解説しているので、ゆる~く読んでみてくださいね。
ただ、一度理解してしまえばプログラミングが楽しくなりますよ!
個人的には、パズルゲームを行う感覚に似ていると思います。
オブジェクトについて
IT用語としては『データのまとまり』といいます。
抽象的にいえば、現実の事柄・モノ ≒ オブジェクトです。
電卓システム 抽象的なオブジェクト例
・四則演算
・結果の表示
・計算結果の履歴
具体的には、システム上の処理・数値や文字列などのデータの集まりです。
電卓システム 具体的なオブジェクト例
・四則演算→入力された『数値』
・結果の表示→計算内容表示の『文字列』
・計算結果の履歴→式と答えの履歴を保存する『文字列』と『数値』
更に具体的なデータの集まりをプログラミングに落とし込むには、『変数』という機能を使用します。
変数
イメージとしてはデータを保存する箱です。
データとは数値や文字列、真偽値などを指します。
変数はプログラミング時に必須ともいえるオブジェクトです。
変数を使用すると、コーディング中に値の変更が容易になる・値を保存できるなどのメリットがあります。
変数を使用しない場合は固定された値しか使用できません。
固定された値こと、変数を使用しない値の別名をマジックナンバーといいます。
マジックナンバーの使用は非推奨です。
何故その値なのか分かり辛い、値の変更には毎回システムを書き直さないといけない等のデメリットが大きいからです。
値は必ず変数として扱うように気を付けましょう。
メソッド
メソッドとはプログラムの処理・関数などをまとめた手続きを指します。
プログラムは簡単な処理の集まりを使って機能を実現します。
足し算の機能を実装する場合は下記のような処理をメソッドとしてまとめます。
// 足し算メソッド() 中身 サンプル
1. 変数『入力値1』生成。中身:ユーザが入力した値
2. 変数『入力値2』生成。中身:ユーザが入力した値
3. 変数『答えの値』生成。中身:空っぽ
4. 足し算処理・結果を変数に代入 『答えの値 = 変数1 + 変数2』
5. 『答えの値』を呼ばれたメソッドに返却する
メソッドの中で変数やシンプルな処理を組み合わせることで、機能の実装が可能です。
引数
なおメソッドには『引数』という値を受け渡せます。
関数やメソッドはその引数を使用して処理を行います。
クラス
システムの設計図です。
具体的なコーディングとして、1クラス毎に1機能をまとめます。
電卓システムを例とする場合、下記がクラスの中身です。
『四則演算クラス』の中身
・足し算メソッド()
L 変数生成、入力値の受け取り、足し算の処理コード、計算結果の返却など
・引き算メソッド()
L 変数生成、入力値の受け取り、引き算の処理コード、計算結果の返却など
・かけ算メソッド()
L 変数生成、入力値の受け取り、かけ算の処理コード、計算結果の返却など
・割り算メソッド()
L 変数生成、入力値の受け取り、割り算の処理コード、計算結果の返却など
クラスの中には『変数』、『メソッド』、『処理』などが入ります。
後々機能が増加する備えのため・またはメンテナンス性を高めるために1クラス=1機能までを意識したクラス作成を推奨します。
インスタンス
クラスを元にした実態です。
クラス内で別クラスの機能を使用したい場合にインスタンスを生成します。
コード上でインスタンス生成することで、他のクラスを実体化して再利用ができます。
例として『Aクラス』と『Bクラス』が存在するとしましょう。
AクラスでBクラスの機能を使用したい場合、
AクラスでBクラスのインスタンス生成をする必要があります。
ざっくりいうとインスタンス生成することで別のクラスを使用できる仕組みです。
他クラスにつなげるための橋渡しみたいな物と思っていただければ。
四則演算クラス
・足し算メソッド()
…etc
計算結果表示クラス
・四則演算クラスのインスタンス生成
・四則演算クラスの『足し算メソッド()』を呼び出す
・足し算メソッドの結果を表示
オブジェクトに関わる機能
オブジェクトに密接にかかわる機能をご紹介します。
・『プロパティ』→オブジェクトに付与する要素
・『コンストラクタ』→インスタンス生成時に初期化する特殊メソッド
・『オーバーロード』→同じ名前・引数の型や並びが異なるメソッドを定義する仕組み
プロパティ
オブジェクトの状態や特性の要素です。
オブジェクトの可視性や状態・属性を設定することで、データの保護や制御が容易になります。
プロパティの一例として下記の『アクセス制御』があります。
アクセス制御
他オブジェクトからのアクセス状態を変更できます。
状態は下記の3つです。
Public (公開) → どのクラスからもアクセス可能
Private (非公開) → 自クラス内でのみアクセス可能
Protected (保護) → 自クラス・『自クラス』の機能を引き継いだクラスのみアクセス可能
コンストラクタ
インスタンスの初期化処理を行います。
正確にいうとコンストラクタはオブジェクトではありません。
コンストラクタが生成するインスタンスがオブジェクトです。
初期化すると任意の設定を反映させられるため、想定外のエラーを防ぎやすくなります。
オーバーロード
同じクラス内に同じ名前・引数の型や並びが異なるメソッドを定義する仕組みを指します。
引数によって処理を変えたい場合に便利です。
計算結果表示クラス
・結果表示メソッド(文字列型 計算式, 数値型 結果の値)
L 表示順序: 計算式 + 結果の値
表示: 『3 + 2 = 5』
・結果表示メソッド(数値型 結果の値)
L 表示順序: 文字列”計算結果: ” + 結果の値
表示: 『計算結果: 5』
オブジェクト指向の代表的な機能
オブジェクト指向の代表的な機能を3種類に分けて説明します。
- 継承→親クラスから子クラスへ機能の引継ぎが可能
2. カプセル化→オブジェクトを秘匿化
3. ポリモーフィズム→クラス毎に『同名のメソッド』を異なる振る舞いで実装できる
機能1: 継承
継承とは『親クラス』の機能を『子クラス』が受け継ぐ機能です。
子クラスで親クラスの機能を再定義・拡張できます。
親クラス
・足し算メソッド(数値型 入力値1, 数値型 入力値2)
L 計算: 入力値1 + 入力値2
…
子クラス
・足し算メソッド(数値型 入力値1, 数値型 入力値2)
L データの形を変更: 数値型 入力値1 → 少数型 入力値1
データの形を変更: 数値型 入力値2 → 少数型 入力値2
計算: 入力値1 + 入力値2
…
多重継承
複数の親クラスから継承する仕組みを多重継承といいます。
コードの複雑化・混乱しやすいという問題点があります。
なお、Javaでは多重継承を使用できません。
機能2. カプセル化
クラス内のデータやメソッドを、外部からのアクセスを制限して秘匿化します。
前述したオブジェクトの1つ『プロパティ』もカプセル化の1つです。
機能3. ポリモーフィズム
同名のメソッドが異なる処理を同じインターフェースを介して実行できます。
ポリモーフィズムとは多様性という意味です。
ポリモーフィズムを実装するには『オーバーライド』という機能を使用します。
オーバーライド
親クラスの同名メソッドを子クラスで再定義する仕組みです。
この機能を使用する事でポリモーフィズムを実現できます。
抽象化
ポリモーフィズムを実装するための手段の1つです。
クラスを抽象化して、共通の振る舞いや特性を持つクラスのためのテンプレートを提供します。
別名はアブストラクタです。
共通処理を抽象化して単純化することで、具体化クラスの設計が容易になる・再利用がしやすくなります。
インターフェース
抽象化とは少し違った、ポリモーフィズムを実装するための手段の1つです。
インターフェースとはクラスの使い方を定義したモノです。
具体的な実装は持ちませんが、クラスのメソッド・属性のシグネチャを定義します。
シグネチャとは
メソッドの名前、引数、戻り値など
オブジェクト指向の代表的な言語
Java : 個人的に入門者におすすめしたい言語No1。資料が豊富、プログラミングの仕組みや動きもわかりやすい
Oracle社のJDKダウンロードページ
Ruby : 日本産の言語。ウェブ開発に向いたフレームワーク『Ruby on Rails』が人気
公式のページ
Python : AIに向いている言語。英語ができるならかなり便利
公式のページ
C# : 視覚的にプログラミングできる。Windowsアプリと相性が良い
公式のページ
最後に
概念ですので理解は難しいと思います。
ただプログラミングを行っていると、パズルを解くように頭で整理されるのでゆっくり学んでいきましょう。
焦らなくても問題ございません。
2・3年たってもわからない方もいらっしゃいます。
でもプログラミングはできます。
システムエンジニアという、システム設計側の立場になるとオブジェクト指向の理解が必要になります。
他にも効率的なプログラミングのためには、オブジェクト指向の概念を習得する事が有効的です。
勉強方法については、文字だけで理解するよりも実際にコーディングすると理解力も深まるのでおすすめです。
次回は上記の概念をJavaのコードで実装していきます。
コメント