オブジェクト指向とは?例を使ってわかりやすく解説!
オブジェクト指向って…本で読んでも、ネットで調べてもわかりにくい!
難しい言葉ばかりでわからない!結局どういうことなの!?
✓本記事の流れ
- ・オブジェクト指向とは?
- ・オブジェクト指向で使われるワードの説明
- ・オブジェクト指向のメリットとデメリット
本記事では、出来る限りわかりやすくオブジェクト指向について解説していきます。
最後にオブジェクト指向のプログラミングを勉強する上でおすすめな本も紹介しているので、参考にしてみてください!
目次
1.オブジェクト指向とは
オブジェクト指向(OOP:Object Oriented Programming)とは、ソフトウェア開発の考え方のひとつで「処理を部品化して、部品を組み合わせることで1つのプログラムを作る考え方」のことを指します。
人がシステム開発を効率的に行うために、多くの言語で取り入れられている概念です。
考え方の話なのでイメージがつきにくいですよね。
オブジェクト指向は、車の例にして表現されることが多くあります。車の部品を個々に作っておけば、色んな車に転用できますよね?
※イメージ図
各車に必要な共通の機能は、同じ機能を使って作成し、各車に独自に備わっている機能を独自に作りこんで実装する。
これをプログラムに落とし込んだ考え方が「オブジェクト指向」なのです。
なお、ユニゾンキャリアではオブジェクト指向を研修でしっかりと学べる企業を紹介しています。
気になる方は、下記から無料相談をお試しください。
\オブジェクト指向が難しい方必見!/
2.オブジェクト指向で使われる概念
オブジェクト指向に触れていると、以下のワードが頻出します。
まずは以下のワードの意味を理解しましょう。
オブジェクト指向でよく出る概念
- ・オブジェクト
- ・クラス
- ・インスタンス
- ・プロパティ
- ・メソッド
それぞれ、オブジェクト指向型言語を扱うために必要なワードです。
少し難しく感じるかもしれませんが、わかりやすく解説していきましょう。
2-1.オブジェクト
オブジェクトは、直訳すると「もの」や「対象」という意味です。
オブジェクト指向プログラミングにおいては、クラスやインスタンスなどを抽象的に「オブジェクト」と呼んでいます。
2-2.クラス
クラスとはオブジェクト指向プログラミングにおいて、オブジェクトの設計図に相当するものです。
車を作るには車の設計図が必要になりますよね。
それと同じように、オブジェクトを作るには設計図が必要なのです。
その設計図を「クラス」と呼んでいます。
2-3.インスタンス
クラスはオブジェクトの設計図ですから、そのまま使うことはできません。
オブジェクトとして使うためには、メモリ上に「クラスの実体」を作る必要があります。
この実体を「インスタンス」と呼びます。
呼び方が多くてややこしいですが、インスタンスはオブジェクトのひとつです。
2-4.プロパティ
プロパティを簡単にいうと「不用意にデータを編集しないように、一部のデータだけを編集できるようにする機能」です。
プロパティを使うことで、カプセル化されたオブジェクトが持っているデータに対し、部分的にアクセスを許可できるようにできるのです。
カプセル化という考え方については、次の項目で詳しく解説していきます。
2-5.メソッド
メソッドとは、「クラスの中で定義された関数」を指します。
関数には「単独で呼び出せるもの」と「クラスを通じて呼び出されるもの」があります。
このうち、前者を”関数”や”サブルーチン”と呼び、後者を”メソッド”と呼びます。
3.オブジェクト指向の三原則
オブジェクト指向の考え方をプログラムに落とし込むためには、「オブジェクト指向の三原則」を理解する必要があります。
オブジェクト指向の三原則
- ・継承
- ・ポリモーフィズム(多態性)
- ・カプセル化
それぞれの概念を、詳しく解説していきましょう。
3-1.継承
継承とは「既存のクラスの機能を受け継いだ新しいクラスを作ること」です。
継承を使うことで、既存のクラスから変数やメソッド(関数)を引き継ぐことが出来ます。
この継承によって、同じような機能を持つクラスであれば新たにコードを書く必要がなくなります。
簡単に言うと、「共通して使えるものを使いまわせるようにする機能」です。
継承元のクラスの呼び方
- ・親クラス
- ・スーパークラス
- ・基底クラス
継承して作ったクラスの呼び方
- ・子クラス
- ・サブクラス
- ・派生クラス
3-2.ポリモーフィズム(多態性)
ポリモーフィズムは、日本語でいうと多態性や多様性を意味します。
その内容を簡単に説明すると、「同じ名前の機能で、全く違う動きをする処理を実装できること」です。
ポリモーフィズムを実装するために、以下の2つの機能が使われています。
2つの機能
- ・オーバーライド
- ・オーバーロード
ポリモーフィズムがどういうことかを理解するためには、この2つの機能を知ることが一番の近道になります。
それぞれ詳しく説明していきましょう。
●オーバーライド
オーバーライドを簡単に説明すると、「継承で引き継いだメソッドを、同じ名前のまま別の処理として上書きできる機能」です。
オーバーライドの説明を理解するためには、まず継承を理解している必要があります。
継承とは「既存のクラス(親クラス)の機能を受け継いだ新しいクラス(子クラス)を作ること」です。
親クラスにメソッド(関数)が作られていた場合は、そのメソッドも子クラスに受け継ぐことができます。
プログラムを組んでいると、この継承したメソッドに「独自に機能を加えたい…」「同じ名前で別の処理をしてほしい…」と思うことが起こります。
その時に役に立つのが、この「オーバーライド」という機能なのです。
例を挙げて説明していきましょう。
「通常の敵」というクラスを継承して、「ボス敵」というクラスを新たに作りました。
ですがこのままだと、ボス敵が攻撃しても通常の敵と同じダメージしか出ません。
通常の敵は[Attack]をした時に1点のダメージしか与えてきませんが、ボス敵はもっとパワーアップした攻撃をするようにしたいです。
この時、[Attack]という名前のまま、通常の敵とは違うボス敵用の[Attack]を作りたいですよね?
そこで使うのがオーバーライドの機能です。
ボス敵クラスの中で新しく[Attack]メソッドを作ると、通常の敵から継承した[Attack]メソッドは、新たに作成したボス敵用の[Attack]メソッドに上書きされます。
こうすることで、ボス敵だけの強い攻撃をすることができるようになります。
上記のことから、オーバーライドを簡単に説明すると「継承で引き継いだメソッドを、同じ名前のまま別の処理として上書きできる機能」になるのです。
●オーバーロード
オーバーロードを簡単に説明すると、「同じ名前の関数(メソッド)を、引数の型や数に応じてそれぞれ定義することができる機能」のことです。
さらに簡単にいうなら、「同じ名前の関数(メソッド)を複数宣言できる機能」のことです。
●関数の用語の解説
オーバーロードの説明に入る前に、まず関数を使う際の用語についておさらいしましょう。
下記の画像では、「CalcIntという関数」に、「int型の変数numA」と「int型の変数numB」を引数として渡しています。
●関数
関数とは、何か特定の動作を行うための機能を持った処理です。
Excelでよく使われる「SUM」や「AVERAGE」も関数というとイメージしやすいでしょうか。
例えばSUM関数であれば、「合計値を計算する機能」を持った関数になります。
●引数
関数に渡す値のことを引数と呼びます。
ExcelのSUM関数であれば、SUM()の括弧内にセルの範囲などを指定しますよね。
括弧内に指定しているものが、引数です。
●データ型
データ型とは、その名の通りデータの種類を意味します。
例えば画像に示されているint型は「整数型」と呼ばれ、このint型を持つ変数には整数を入れることができるのです。
整数型以外にも、文字列型、小数型、日付型など、様々な種類があります。
●変数
変数とは、数値や文字など、データを入れるための領域のことです。
よく「データを入れる箱」という言葉で例えられます。
プログラミングでは、この変数にデータを入れて処理を行います。
●オーバーロードの利点
関数は、引数のデータ型や引数の数が変わるごとに、それに対応した関数を作らなければなりません。
この時オーバーロードの機能を使わない場合は、全ての関数に違う名前を付ける必要があります。
「全部同じ処理をさせるから、似たような名前の関数名にしよう!」と似たような名前を付けてしまうと、同じ名前の関数が沢山出来てしまい、わかりにくくなってしまいます。
「同じような名前の関数が沢山出来てしまってわかりにくい…」
「関数が沢山できて、どの関数を使えばいいかわからない…」
こういう時、オーバーロードの機能を利用すると全部同じ名前の関数として定義できるのです。
オーバーロードの機能を使うと、引数の違う関数を同じ名前で定義できます。
似たような関数が沢山できてしまうことや、どの関数を使えばいいかわからないなんてことをなくせるのです。
「でも同じ名前の関数を沢山作ったら、プログラムがどれ使えばいいかわからなくなるんじゃ…?」
大丈夫です!
オーバーロードの機能には、同じ名前の関数が複数定義されていた場合、関数の呼び出され方によって自動で判別して適切な関数を呼び出してくれる機能が備わっています。
これをオーバーロード解決と呼びます。
それでは、実際にオーバーロードを使用するとどのようになるか、Javaのプログラムを例に見ていきましょう。
public class OverloadingExample { // ①文字列を受け取り、そのまま表示するメソッド public void printMessage(String message) { System.out.println(message); } // ②数値を受け取り、その数値を含むメッセージを表示するメソッド public void printMessage(int number) { System.out.println(“数字は” + number + “です。”); } // ➂文字列と数値のを受け取り、組み合わせたメッセージを表示するメソッド public void printMessage(String message, int number) { System.out.println(message + “:” + number); } public static void main(String[] args) { OverloadingExample example = new OverloadingExample(); // 文字列だけを渡す = ①を呼び出す example.printMessage(“計算を開始します!”); // 数値だけ渡す =②を呼び出す example.printMessage(42); // 文字列と数値を渡す = ➂を呼び出す example.printMessage(“1~10を全部足すと”, 55); } } |
上記のプログラムを実行すると、以下の結果が出力されます。
計算を開始します! 数字は42です。 1~10を全部足すと: 55 |
それぞれの呼び出しに対して、適切なメッセージが出力されたのがわかると思います。
これが「オーバーロード」の機能です。
この機能を使うことによって、引数ごとに使う関数を意識する必要なく開発できるというメリットがあります。
3-3.カプセル化
カプセル化とは、「オブジェクトのデータを、カプセルに入れるように他の機能から隠ぺいすること」です。
「データをカプセルに入れるって…??」
そう思われる方も多いと思います。
カプセルというと何を思い浮かべるでしょうか?
多くの場合はカプセルに入った薬を想像されると思います。
オブジェクト指向におけるカプセル化も同じイメージです。
オブジェクトのデータをカプセルに入れて、外から見えないように隠ぺいするのです。
「隠ぺいするって…なんで??」
外から見えるままだと、誰にでもデータを編集出来てしまいます。
そうすると、想定していない処理に勝手にアクセスされて、知らないうちにデータを書き換えられてしまう可能性があるのです。
それを防ぐために、カプセル化は行われます。
データが知らないところで勝手に編集されないよう、守るための機能が「カプセル化」なのです。
4.オブジェクト指向の言語の一覧
オブジェクト指向の考え方は、幅広い言語で取り入れられています。
ここでは、その一例をご紹介いたします。
●Java
Javaはアプリケーション開発などで幅広く使われている言語です。
オブジェクト指向の代表例として挙げられることもあり、ノウハウ本が多く出版されています。
●PHP
PHPは主にWEBアプリケーションのバックトエンド開発で使われている言語です。
ネットショップ等のECサイトや、WordPress等で用いられています。
●Ruby
Rubyは日本の技術者が開発したプログラミング言語で、WEBアプリケーション開発等で用いられます。
シンプルで初心者にも学びやすく、日本語でのノウハウが多い言語でもあります。
●JavaScript
JavaScriptはWEBアプリケーションのフロントエンド開発で使われている言語で、ブラウザ上でWebページに動きをつけるために用いられています。
●Python
Pythonは人工知能をはじめとした幅広い分野で使われている言語です。
オブジェクト指向言語ではありますが、コードが短くわかりやすいため初心者にも学びやすい言語になります。
●Swift.
SwiftはApple社が2014年に発表したプログラミング言語で、Apple製品向けソフトウェア開発に向いている言語です。
●R言語
統計分析など、データの解析を行うことに特化した言語です。
人工知能や機械学習の普及に伴い、需要が増えている言語でもあります。
●C#
C#はMicrosoft社が開発した言語です。C言語とJavaを元に作られており、どちらかといえばJavaに近いプログラミングが可能です。
Unityというゲーム開発プラットフォームでは、C#を使って開発が行われています。
●C++
C++はC言語にオブジェクト指向の機能等を加え、改良した言語です。
C言語を拡張した言語であるため、C言語と互換性があることが特徴です。
●VB.Net
VB.NET(Visual Basic.NET)は、Microsoft社が開発した言語です。
フォームを使ったプログラミングが特徴的で、Windows系アプリケーションで使用されることがあります。
5.オブジェクト指向を扱うメリット
オブジェクト指向の考え方は様々な言語で取り入れられていますが、オブジェクト指向を意識することでどんなメリットがあるのでしょうか。
5-1.効率的に開発が行える
オブジェクト指向プログラミングでは、処理を部品化するという考え方でプログラミングを行います。
部品化した処理は色んなところで使いまわすことができるため、その分開発にかかる時間を短縮することが可能です。
「全ての処理を1から作成していく」のではなく「使いまわせるところは使いまわす」ことで、効率的に開発を行えます。
5-2.メンテナンスがしやすい
オブジェクト指向では、使いまわせる処理は使いまわすようにプログラミングをしています。
そのことから、処理に不具合や改修があった場合、1つの処理を修正すれば使いまわした箇所全てに適用されるのです。
修正漏れがなくなることから、メンテナンス性は高いと言えるでしょう。
6.オブジェクト指向を扱うデメリット
オブジェクト指向を扱う上で大きなデメリットはありませんが、オブジェクト指向は理解するのに時間がかかることはデメリットとして挙げられるでしょう。
実際数多くのプログラマが、オブジェクト指向を理解しようとして躓いています。
オブジェクト指向を完全に理解するためには、実際にプログラミングを行って徐々に理解していくのが一番近道になります。
ですので、経験が浅いうちはどうしても「理解するのが難しい」と感じてしまうことがあります。
7.オブジェクト指向を勉強するのにおすすめな本
オブジェクト指向言語を学んでいく上で、参考になる本をおすすめとしてピックアップしました。
今後オブジェクト指向を使った開発をしていきたい方は、是非参考にしてみてください!
7-1.新わかりやすいJava オブジェクト指向徹底解説 第2版
出典:Amazon
本書のおすすめポイント!
Javaを勉強している方でしたら、オブジェクト指向を勉強するのにはこの一冊がいいでしょう。
オブジェクト指向を勉強する上で難しい単語を、対話や図、プログラムを用いて丁寧に説明してくれています。
プログラミングを始めた方、オブジェクト指向を勉強して詰まってしまった方におすすめです!
7-2.良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方
出典:Amazon
本書のおすすめポイント!
オブジェクト指向やプログラミングの勉強をした後で、プログラマが必ずぶつかる壁があります。
ぶつかる壁
- ・オブジェクト指向を使うって…この書き方で正しいのかな
- ・コードがわかりにくいって言われたけど、どう直せばいいのかわからない…
- ・プログラマーとして成長したい。でも良いコードを書くにはどうすればいいんだろう…
本書はそんな方に向けて、良いコードの書き方と悪いコードの書き方を比較しながら解説している本になります。
オブジェクト指向を使ったコードの例にも触れているので、正しいオブジェクト指向プログラミングを知りたい方におすすめの一冊です!
8.オブジェクト指向のご相談はユニゾンキャリアへ
オブジェクト指向を簡単に説明すると、「処理を部品化して、部品を組み合わせることで1つのプログラムを作る考え方」のことです。
オブジェクト指向の三原則として、以下の3つのものがあります。
- ・継承
- ・ポリモーフィズム(多態性)
- ・カプセル化
オブジェクト指向を理解するには、実際にプログラミングをしながら徐々に理解をしていく方法がわかりやすいです。
また、本記事を通してもオブジェクト指向についてイマイチよく分からなかったという方も多くいるでしょう。
ですが、安心してください!
ユニゾンキャリアへご相談してもらえればオブジェクト指向に限らずITに関する不安や疑問などを丁寧に解消していきます。
「すぐに相談してみるのは怖い」「ユニゾンキャリアで本当に解決できるの…?」とお考えの方は実際にユニゾンキャリアを利用してみた人の意見を見てみてください。
このようなことで
悩まれています。
簡単30秒
まずは気軽にWebで無料相談
こんにちは!
はじめに職歴をお聞かせください。
この記事の監修者
エンジニア
大学卒業後、新卒で不動産会社に就職。その後23歳で開発エンジニアにキャリアチェンジし、3年間大手Slerにて様々な開発に携わる。その後、インフラストラクチャー企業にて人材コンサルタントとして経験を積み、株式会社ユニゾン・テクノロジーを創業。現在の代表取締役