オブジェクト指向について今日は紹介するよ!
- オブジェクト指向ってなに?
- オブジェクト指向が全然わからない
- オブジェクト指向って何のためにあるの?
などの疑問をお持ちの方の悩みを解決できる記事になっています!
プログラミング初心者にとって、オブジェクト指向は難しい概念かもしれません。
しかし、使いこなせるようになれば強力なツールになります。
この記事では、現役のフリーランスエンジニアがオブジェクト指向の基本、使い方、メリット、オブジェクト指向のプログラミング言語について解説します!
「オブジェクト指向を独学したけどよくわからなかった」という人は最後まで記事を読んでください。
オブジェクト指向の基本が理解ができるようになります!
- プログラミングを始めたばかりの人
- オブジェクト指向の基本を理解したい人
- オブジェクト指向を独学で挫折した人
目次
オブジェクト指向を学ぶ前に
オブジェクト指向は、システム開発において強力なツールになります。
習得するには実際に設計し、コードを書いて、体で覚える必要があります。
この記事でオブジェクト指向をマスターすることは無理でしょう。
しかし、オブジェクト指向の基本や用語を理解する手助けにはなると思います。
記事を読み終えたら、実際にRubyなどのオブジェクト指向言語を使ってみましょう。
クラスや継承、ポリモーフィズムを体感することで、開発の現場で応用することができます。
プログラミングを始めたばかりの初心者の人は、すぐに使いこなせなくても大丈夫です。
なにか課題に遭遇したときに、オブジェクト指向の手法を思い出してください。
そして、目の前のコードに応用できるか試してみるのです。
そうした実践的な使い方をすることで、オブジェクト指向を体で覚えることができます。
そのためにオブジェクト指向の基本をここで頭の片隅にインプットしておきましょう!
オブジェクト指向とは
簡潔に言うと、オブジェクト指向とは「効率的に開発を行うための技術」を指します。
以前はオブジェクト指向と言うと、あらゆるデータや対象を「もの」として扱い、「もの」を効率的に組み立ててプログラムを作る手法と説明されていました。他のサイトでこのような説明を見た方は多いのではないでしょうか。
確かに、オブジェクト指向はデータを「もの」として捉えて、組み上げるプログラミング手法です。しかし、最近ではシステム開発の多様化に伴い、オブジェクト指向はシステム開発全体をスムーズに行うための総合的な技術として定義されます。
オブジェクト指向の変遷
総合的な技術になった背景を理解するために、オブジェクト指向の変遷を見てみましょう。
オブジェクト指向の起源は、「Simula67」というプログラミング言語として開発されました。「Simula67」はこれまでなかった、「クラス」「継承」「ポリモーフィズム」という概念を導入してオブジェクト指向プログラミング言語(OOP)と呼ばれるようになりました。
その後、同様の機能をもつプログラミング言語に引き継がれて、「オブジェクト指向」という概念が確立しました。
オブジェクト指向をプログラミングに適用することで、再利用可能なプログラムを作ることが可能になり、そこで使われたアイデアが発展し、「デザインパターン」と呼ばれる設計手法が誕生します。
次に、オブジェクト指向の考え方を図式で表現する方法が設計され、「UML(統一モデリング言語)」と呼ばれるクラスを図式化する手法が誕生しました。
また、オブジェクト指向はプログラミングの現場だけでなく、上流工程にも応用されます。業務分析、要件定義、設計をする「モデリング」として使われるようになりました。
オブジェクト指向と一言でいっても、このように多様な要素が絡みあっています。そのため、オブジェクト指向は初心者が混乱しやすいのです。
覚えておくべきことは、オブジェクト指向は「システム開発全体を効率化するための総合的な技術・考え方」ということです。
まとめると、オブジェクト指向を構成する要素は次の通りです。
用語 | 意味 |
オブジェクト指向プログラミング(OOP) | クラス、継承、ポリモーフィズムといった概念を用いたプログラミング言語 |
デザインパターン | プログラミングにおける、効率的な書き方をパターン化したもの |
UML(統一モデリング言語) | システムの機能や内部構造を図式化して表現したもの |
モデリング(業務分析、要件定義、設計) | システムを定義するための工程 |
この用語だけ見ても今はわからないと思いますが、なんとなくこんなのがあったなぐらいの感覚で大丈夫です。
自分でオブジェクト指向の設計やプログラミングすることで、少しずつ理解できます。
オブジェクト指向の二つの側面
オブジェクト指向は、プログラミングの手法から上流工程のモデリングまで含めた総合的な技術と解説しました。
しかし、それぞれのフェーズで扱う技術・考え方が異なります。
上流工程で行うモデリングは、抽象的な現実世界の仕様を整理するための技術を要します。
下流工程のプログラミングでは、具体的なプログラミング手法でオブジェクト指向を表現します。
この記事でのオブジェクト指向とは
この記事で紹介するオブジェクト指向は、具体的なプログラミング手法に着目したものです。
そのため、次のような概念について詳解します。
- クラス
- カプセル化
- 継承
- ポリモーフィズム
オブジェクト指向を開発の現場で使いこなすためには、これらの概念をしっかりと理解する必要があります。
これらは、記事の後半で解説します。
なぜオブジェクト指向が必要なのか
では、どうしてオブジェクト指向が必要なのでしょうか。
それは、「楽して効率的に作りたい」からです。
大規模なアプリケーション開発は大量のデータを扱い、さまざまなパターンを仕様に落とし込みシステム化していきます。
そして、ビジネスの変化と共にアプリケーションも柔軟に変更しなければいけません。
システムが複雑化していると、ちょっとした機能追加も困難になります。また、一行コードを書き換えただけで大きなバグを生むかもしれません。バグが発生すれば、サービスはストップし、顧客の信頼を失うでしょう。
バグは必ず発生するものです。しかし、発生率を低くすることは可能です。
オブジェクト指向の開発手法はこのような問題を解決するためにあります。
オブジェクト指向のメリットとは
では、オブジェクト指向で開発するとどんなメリットがあるのでしょうか。
オブジェクト指向のメリットを一つずつ見てみましょう。
- メンテナンス性が高くなる
- プログラムの拡張性が高くなる
- チーム開発がしやすくなる
メンテナンス性が高くなる
オブジェクト指向は、ソフトウェアの再利用やメンテナンス性を向上させるための技術です。
データを「もの」として扱い、一つ一つの部品を作ります。そして、それを組み立ててシステム全体の機能を提供します。
部品の独立性を高くすることで、他の機能への影響を最小限に抑えることができ、再利用性を上げることができます。
例えば、ショッピングサイトなどで「お気に入りボタン」がありますよね。
引用元: zozotown
このボタンはサイト全体で使われます。商品詳細画面や、一覧画面、カート画面など。
そして、それぞれの「お気に入りボタン」は見た目は微妙に違うけど、押下したときの機能が同じとします。
もし、これを一つずつ実装するとたくさんの数になります。
「お気に入りボタンが押された時の機能」を全ての画面で書かなければいけません。
これは、効率化ではありませんね。
オブジェクト指向では、このようなものを「もの」としてとらえ、部品にします。そして、部品には共通の機能をつけます。
そうすることで、全ての画面の「お気に入りボタン」は共通の機能をもつことができます。また、変更があったときも一箇所を修正するだけで済みます。全ての画面を修正する必要はありません。
「お気に入りボタン」の独立性を高めることで、カートや商品選択などの他の機能に影響しません。
オブジェクト指向で開発すると、メンテナンス性を高め、安全にプログラム開発ができます。
プログラムの拡張性が高くなる
オブジェクト指向で開発すると、プログラムの拡張性が向上します。
先ほどの例で見てみましょう。
あるショッピングサイトで「お気に入りボタン」が2種類あったとします。
- お気に入りボタンA
- お気に入りボタンB
そして、この二つは「押されたときの挙動」が同じものとします。
ここに、デザインチームから新しい「お気に入りボタンC」を追加するよう頼まれました。
普通に実装すると、新しいボタンを追加して機能も実装しなければなりません。
しかし、オブジェクト指向ではすでに共通機能を持った部品が定義されています。
この部品から派生させて、「お気に入りボタンC」を新たに作ります。
すると、同じ機能を持つ新しいボタンが追加されます。
新しいボタンにわざわざ「押されたときの挙動」を書く必要はありません。なぜなら、すでに共通化されているからです。
このようにオブジェクト指向で機能を共通化をすることで、拡張の高いプログラム開発が可能となります。
チーム開発がしやすくなる
オブジェクト指向は、チーム開発に適した技術です。特に中規模・大規模開発に向いています。
なぜなら、オブジェクト指向では、詳細な設計をすることでデータ(もの)同士の関係性を明確にできるからです。
大規模な開発になると、多くの人が関わります。
少人数ではコミュニケーションで解決できることも、何十人、何百人もいると困難でしょう。
「もの」同士の関係性がコード上で判断できれば、システムの流れを理解することができます。
システムの流れが明確だと、機能追加や変更がしやすくなります。
わざわざ誰かに聞かないとわからないコードでは、チーム開発が難しいでしょう。
オブジェクト指向は、「利便性を高めてわかりやすくする」が重要になります。
デザインパターンやモデリングを活用することで、チーム間の問題を解決できるメリットがあります。
オブジェクト指向の基本概念
それでは、プログラミングにおけるオブジェクト指向の基本概念を見てみましょう。
オブジェクト指向の基本概念は次の通りです。
- クラス
- 継承
- カプセル化
- ポリモーフィズム
クラスとは
クラスとは、オブジェクト指向の基礎となる概念です。
クラスと対になるのが「インスタンス」というものです。
この二つはセットで覚えておきましょう。
クラスとは、英語訳で「種類」「分類」を意味します。つまり、「性質が同じものの集まり」です。
一方、インスタンスは「具体的なもの」を意味します。
これを具体例で見ると、次のような関係になります。
クラス(種類) | インスタンス(具体的なもの) |
国 | 日本、アメリカ、イギリス、韓国、イタリア |
車 | プリウス、アルファード、レクサス、ベンツ、アウディ |
果物 | りんご、オレンジ、メロン、ぶどう |
クラスが種類で、具体的なものがインスタンスということがわかりますね。
クラスは共通する性質をまとめて分類するのに加えて、次の3つの要素を持ちます。
- 名前(クラス自身の)
- データ
- ふるまい
先程の例で、「車」で当てはめてみましょう。
車は「排気量」「色」「メーカー」「年式」などのデータをもちます。そして、「走る」「止まる」「曲がる」というふるまいをもっています。
名前(クラス自身の) | データ | ふるまい |
車 |
|
|
車という分類をして、そこの車に共通のデータ(属性)やふるまい(動作)を定義します。
オブジェクト指向では、この3つの要素の集合をまとめてクラスをいいます。
そして、この「データ」と「ふるまい」は「プロパティ」と「メソッド」と呼ばれます。
要素 | プログラミングでの呼び方 |
データ | プロパティ(property) |
ふるまい | メソッド(method) |
プロパティとメソッドは一般的に使われるプログラミング用語なので覚えておきましょう。
それでは、このクラスの抽象的な要素をもとにインスタンスを使って具体的なものを作ってみましょう。
車の例で見てみましょう。
インスタンスは具体的なものを指します。そのため、ここでは「プリウス」と「ベンツ」を作ります。
インスタンス | データ(プロパティ) | ふるまい(メソッド) |
プリウス |
|
|
ベンツ |
|
|
プロパティの値はそれぞれ異なりますが、メソッドは同じものを持っていますね。
このように、クラスの要素から具体的なものをつくることを「インスタンス化」させるといいます。
そして、そのインスタンス化させたものを「オブジェクト」といいます。
クラスからインスタンス化させることで、共通のメソッドを持ったオブジェクトを生成することができます。
オブジェクト指向では、このように共通の性質を抽出して、大量のデータをつくることができます。そのためにクラスは使われます。
まとめると、クラスの定義は次のようになります。
- クラスとは「分類」を意味し、「性質が同じものの集まり」
- クラスは「名前」「データ(プロパティ)」「ふるまい(method)」の3つの要素から構成される
- 共通の性質を抽出して、大量のデータを作る(インスタンス化)ためにクラスは使われる
継承とは
継承とは「共通の特徴を共有すること」です。
オブジェクトは抽象的なものから具体的なものになると、共通の特徴を抽出できます。
例えば、
「動物」>「哺乳類」>「ヒト」>「男性」>「会社員」>「プログラマー」
と抽象から具体的なものへと変遷があるとすると、
- 「食べる」
- 「寝る」
などの全てにあてはまる特徴を抜き出すことができます。
プログラミングに当てはめると、「動物クラス」という抽象クラスが「食べる」「寝る」というふるまいを持っていれば、「プログラマークラス」も同じふるまいを継承できるということです。
このように、継承は共通の特徴を共有して効率的にクラス設計をするために使われます。
継承をまとめると、次のようになります。
- 継承は、「共通の特徴を共有すること」
- 継承は、効率的にクラス設計をするために使われる
カプセル化とは
カプセル化とは、オブジェクトのプロパティやメソッドを隠して他から見られないようにする仕組みです。
なぜ、隠す必要があるのでしょうか。
例えば、人というクラスがあるとします。
人クラスはプロパティとメソッドに次のようなものを持っています。
クラス | プロパティ | メソッド |
人 |
|
|
プロパティの値は、「18歳」だとしましょう。
「歳を答える」というメソッドは「18歳」と答えます。
この場合、二つは同じ「18歳」を返します。
このクラスをインスタンス化してオブジェクトとして使うときに、「プロパティの年齢」を見たり、「メソッドの歳を答える」を使う人がいたりと、バラバラになってしまいます。
これを防ぐために、どちらかをカプセル化して隠してしまいましょう。
この場合、プロパティを他から見られないようにすれば「歳を答える」だけ使われることになります。
クラス | プロパティ(見えない) | メソッド |
人 |
|
|
このようにすれば、バラバラにならずに統一した仕組みを提供することができます。
まとめると、カプセル化の目的は次の通りです。
- オブジェクトのプロパティを勝手に書き換えられないようにするため
- アクセスできるプロパティやメソッドを明確にするため
ポリモーフィズムとは
ポリモーフィズムとは、日本語でいうと「多態性」「さまざまな形に変わることができる」というような意味を持ちます。
しかし、「さまざまな形に変わることができる」とはどういうことでしょうか。
例えば、動物を例にしてみましょう。
ほとんどの動物は「鳴く」という動作をしますね。
犬、猫、鳥、ネズミ、カエルなど人も含めて「鳴く」ことができます。
しかし、同じ「鳴く」でもそれぞれ異なる音を出しますね。
犬なら「ワン」、猫なら「にゃー」、ネズミなら「チューチュー」など。
「鳴く」動作は同じだけど中身が違うこと、これを「多態性」、「ポリモーフィズム」といいます。
動物 | 動作 | 鳴き方 |
犬 | 鳴く | ワンワン |
猫 | にゃー | |
ネズミ | チューチュー | |
カエル | ゲコゲコ |
なんとなくイメージはできたでしょうか。
では、オブジェクト指向でポリモーフィズムを考えてみましょう。
オブジェクト指向でいうポリモーフィズムとは、「別々のクラスに共通のメソッドを持たせて、異なるメッセージを送ること」です。
動物の例で見てみましょう。
犬、猫、鳥、ネズミ、カエル、それぞれのクラスがあるとします。
これらのクラスはプログラムの中で「鳴く」動作をしなければなりません。
しかし、それぞれの「鳴き声」は違いますよね。
そのため、それぞれのクラスで「cry」という共通のメソッドを定義して、中身だけ変えます。
クラス | メソッド | メソッド内の動作 |
犬 | cry | ワンワン |
猫 | にゃー | |
ネズミ | チューチュー | |
カエル | ゲコゲコ |
このように定義することで、プログラムからそれぞれのクラスを利用するときは「cry」を呼び出せば、対象のクラスが犬だろうが、猫だろうが関係なく「鳴く」動作を実行できます。
このように「共通のメソッド(cry)を持たせて、異なるメッセージ(鳴き声)を送ること」で、コードをシンプルに保ち、拡張性の高い開発ができるのです。
説明だけだとイメージがつきづらいので、実際にコードを書くことをおすすめします。
ポリモーフィズムをまとめると、次のようになります。
- ポリモーフィズムとは、「多態性」「さまざまな形に変わることができる」という意味
- 「鳴く」動作は同じだけど中身が違うことを「多態性」と言う
- オブジェクト指向のポリモーフィズムは、別々のクラスに共通のメソッドを持たせて、異なるメッセージを送ること
- ポリモーフィズムの目的は、多様なパターンでもコードをシンプルに保ち、拡張性の高い開発をすること
こちらの記事でサンプルコードを交えて、具体的な実装方法を紹介しています。実際にコードで書いて、ポリモーフィズムの有用性を実感してみましょう!
オブジェクト指向のプログラミング言語とは
- Java
- PHP
- Ruby
- Python
- JavaScript
Java
Javaは、1995年にSun Microsystemsからリリースされたオブジェクト指向のプログラミング言語です。
オブジェクト指向の機能以外にもガベージコレクション、マルチスレッドに対応しています。
Javaは、JITコンパイラを用いてJavaバイトコードと呼ばれる中間言語をコンパイルします。JavaバイトコードはJVMというJava仮想マシン上で実行されます。そのため、異なるOS間でもJVM環境があればプログラムを実行することができます。
PHP
PHPは、サーバーサイドで動作するプログラミング言語です。
クラスや継承の機能があり、オブジェクト指向の設計ができるようになっています。
PHP7からは、型の定義ができるようになりました。そのため、よりメンテナンス性の高いプログラム開発が可能です。
Ruby
Rubyは、日本で生まれたプログラミング言語です。
まつもとゆきひろ氏によって開発されました。
Rubyの文法はシンプルで初心者にも書きやすいのが特徴です。Rubyで最も重視されているのは「ストレスなくプログラミングを楽しむこと」です。そのため、他の言語と比べると記述量が少なくコードを書けます。
Python
Pythonは、1990年代初頭に公開されたプログラミング言語です。
アプリケーション開発やシステム管理に広く利用されていましたが、2010年ごろから機械学習・ディープラーニングの技術として注目を浴びました。
Pythonは、AIエンジニアやデータサイエンティストで必須のプログラミング言語です。
機械学習やディープラーニングで使われるライブラリは、ほとんどPython製です。そのため、AIアプリケーションはPythonが主流になっています。
機械学習以外でも、DjangoなどのWebアプリケーションフレームワークを使ってサーバーサイド開発も可能です。他の言語と同様にオブジェクト指向を使って、開発の効率化をすることができます。
JavaScript
JavaScriptとは、Webブラウザで動くプログラミング言語です。
WebサイトやWebアプリケーションのUIや動き、アニメーションをつけるために使われます。
フロントエンドエンジニアを目指す人は必須のプログラミング言語となります。
JavaScriptでも、ES6から「class」キーワードが導入され、クラスが使えるようになりました。
そのため、他の言語と同様にオブジェクト指向の基本的な概念を使うことができます。
なぜオブジェクト指向で挫折するのか
- オブジェクト指向の基礎知識がないから
- 実際にコードを書いてないから
オブジェクト指向の基礎知識がないから
オブジェクト指向がわからない理由は、オブジェクト指向の全体像を理解していないからです。
オブジェクト指向は開発を効率化するための総合的な技術です。
上流工程のモデリングと下流工程のプログラミングでは、使用する技術や考え方が異なります。
そのため、初心者の人が混乱しやすいのです。
それぞれのフェーズで必要な知識を理解する必要があります。
例えば、モデリングではオブジェクトを整理する技術が必要で、プログラミングでは具体的な手法(クラス、継承、ポリモーフィズム)が必要です。
これらの基礎知識を理解しないと、オブジェクト指向の全体像は掴めないでしょう。
また、オブジェクト指向関連の用語が多いのも一因です。
- オブジェクト
- 継承
- スーパークラス
- サブクラス
- インターフェース
- GC
- デザインパターン
- UML
- アジャイル
- XP
これらはオブジェクト指向関連の情報で頻繁に出てきます。
オブジェクト指向自体、扱う上流から下流と分野が広がっっているので特殊な用語が増えてきました。
これは仕方ないことですが、最初から全てを覚える必要はありません。
例えば、本記事で紹介したプログラミング技術に関する用語は覚えておきましょう。
範囲を狭めることで、理解を深めることができます。
実際にコードを書いてないから
プログラミング技術に関するオブジェクト指向は、実際にコードを書かなければ習得できません。
初見で、継承やポリモーフィズムを理解し、実装できる人は少ないでしょう。
まずは、サンプルを真似して写経しましょう。
そして、動作確認することで体で覚えるのです。
GitHubなどにサンプルコードをコミットしておけば、後から復習できます。
まとめ
この記事では、オブジェクト指向についてまとめました。
最後にもう一度内容を確認しましょう。
オブジェクト指向の覚えておく概念は次の通りです。
- クラス
- カプセル化
- 継承
- ポリモーフィズム
独学でオブジェクト指向をマスターするのは難しいです。
実践で使うことで、オブジェクト指向は習得できます。
しかし、初心者の頃は何が正解か判断がつきませんよね。
効率的に習得するには、プログラミングスクールに通って講師に聞くか、MENTAなどのオンラインツールを活用するのがおすすめです!
なぜなら、プロのエンジニア講師に聞いた方が圧倒的に効率的だからです。さらに、プログラミングスクールでは実践的な課題があり、独学よりも実践力を身につけることができます。
未経験でエンジニアに転職したい人は、検討してみましょう!