オブジェクト指向という言葉をプログラミングについて調べた方は1度は目にしたことがあるでしょう。でも、オブジェクト指向というのは考え方なので、抽象的で分かりにくいと感じている方もいらっしゃると思います。
本記事ではオブジェクト指向のプログラミングについて、中心となる考え方を用語と共にご紹介しています。 他の考え方との違い、対応するプログラミング言語、メリットや実際の利用例、学習方法などを見ていきましょう。
Contents
オブジェクト指向とは
オブジェクト指向とはプログラミングにおいて、設計や実装の方法論として広く浸透しているものです。
従来の手続き型プログラミングに慣れてる方からするとに比べると、取っ付きにくいイメージがあるかもしれません。 手順だけ書けばいい手続き型プログラミングに対してオブジェクト指向プログラミングでは抽象的なオブジェクトという存在を扱う必要があるため、設計について一層の理解が求められるからです。
それでも正しく設計されたオブジェクト指向のプログラミングでは、具体的でわかり易く再利用性の高いプログラムを作れるため多くのプロジェクトで利用されています。
手続き型言語(命令型言語)との違い
オブジェクト指向 | 手続き型言語 | |
難易度 | 高 | 低 |
再利用性/保守性 | ◎ | △ |
規模 | 大規模向き | 小規模向き |
オブジェクト指向のプログラミングでは、手続き型と比べてオブジェクト同士の関係、オブジェクトの振る舞いに注目してプログラミングします。
具体的にイメージするため航空機を作ることを想定してみます。 たくさんの人が乗る大型旅客機や少人数向けのプライベートジェット、さらに広げるとヘリコプターやグライダーも含まれるかもしれません。 飛ぶ物としての性質はある程度共通しているため、共通の性質を挙げることができます。例えば
- 翼がある
- 飛行する
- 高度を調節する
- 着陸する
- 乗客の人数
共通の機能や性質を手続き型言語でもある程度サブルーティンで共通化したコードを作成できますが、 オブジェクト指向では飛ぶ物の共通部分をコード化し、飛行・着陸・乗客といって大型旅客機とプライベートジェットで実際が異なる部分をプログラミングし共通部分と個別の部分を分けて考えるので保守性に優れ、規模の大きな開発でも再利用性の高いプログラミングが可能です。
関数型言語(関数型プログラミング言語)との違い
関数型言語では、主役になるのは関数とよばれます。
オブジェクト指向ではモノとモノの関係が重視されますが、関数型言語では関数を組み合わせてプログラミングするため、関数の組み合わせやすさや一貫性など関数の性質に着目します。
先ほどの航空機で例えると、いろいろな航空機よりも、いろいろな飛びかた、着陸のしかたなど動きを無駄なく一貫性のあるコードで表現できます。
関数型言語は関数の性質に着目するので、いろいろなモノが登場する現実路線のオブジェクト指向と比べると、研究やデータ処理などロジックが重視される分野での利用に向いています。
また、関数型言語とオブジェクト指向言語が統合されたScalaという言語も存在しています。Scalaについては関連記事の中でまとめていますので、ぜひこちらの記事をご覧ください。
関連記事:Scala言語って何?言語の特徴、Javaとの関係性やメリット・デメリットを解説
オブジェクト指向を理解するため必要な考え方
オブジェクト指向のプログラミングでは、特有の用語がいくつか登場します。代表的な用語を見ていきましょう。
オブジェクト
オブジェクトとは共通の性質をもつものを表わす言葉で、用語としてはさまざまな場面で使われるためあとでご紹介するクラス・インスタンスいずれの意味でも使われます。
「オブジェクトを作る」「オブジェクトを呼び出す」「オブジェクトに機能Aを付ける」「オブジェクトの機能」などの言い回しがあります。
クラス
クラスは共通の性質をもつモノをまとめます。
どのような共通の性質があるのか、共通項をリストアップするようなイメージです。
航空機の例では、航空機クラスに属する物ならAもBも「飛ぶ」「着陸する」「乗客がいる」などの性質があることをプログラミング言語で指定していきます。
他の近い考え方としてはデータ型があります。数値なら足せる、文字列なら連結できるなどの共通の性質をもつデータ型を意識してプログラミングするのは手続き型言語でもよくあります。
インスタンス
インスタンスは、具体化された一つ一つのモノを表わします。
プライベートジェット製品のなかでも、A社が発売したプライベートジェット、B社が発売したプライベートジェットでは材質の違いや航続距離の違いがあるかもしれません。「飛ぶ」「着陸する」「少人数向け」などの特長はA社・B社とも共通ですが、他の面で具体的な違いがあるわけです。
オブジェクト指向のプログラミングでインスタンスは、A社のプライベートジェット、B社のプライベートジェット、と似ているけれど違いのある個別の物を表わします。プログラミングする際は、A社のプライベートジェット・B社のプライベートジェットは変数に代入でき、両方とも「飛ぶ」操作(関数、メソッド(後述))をおこなえます。
プロパティ
プロパティは、オブジェクトの持つ性質をプログラミングで表現します。
、航空機の例では「A社製」「B社製」などのメーカー、現在の飛行速度などがプロパティとして考えられます。
オブジェクト指向のプログラミングではあらかじめプロパティを定義しておき、処理の過程でメソッド(次項)などを通じてプロパティの中身を読み書きします。
メソッド
メソッドは、オブジェクトが持つ動作や機能をプログラムした物で、手続き型言語における関数に対応するものです。
航空機の例では、飛行機が「着陸する」「乗客を一人追加する」などの動作や状態変化をおこなうメソッドを定義しておき、使用します。
オブジェクト指向の原則
共通の性質をもつものを扱うことでプログラミングしていく オブジェクト指向のプログラミングでは、手続き型言語などには見られない、設計・コーディングでの原則があります。
代表的な原則を見ていきましょう。
継承
共通の性質をもつものを、性質を受け継いでさらに別のオブジェクトにするプログラミングでの再利用性を高める考え方の一つです。
航空機の例では、シンプルまたは抽象的な「飛ぶ物」オブジェクトを先に定義しておいて、 より具体的な「多数の旅客を乗せる飛行機」「少人数向けの飛行機」を定義するとしましょう。
性質は共通しているところがありますから「飛ぶ」「着陸する」を「飛ぶ物」クラスで定義していれば 継承して「少人数向けの飛行機」で再利用できます。そして「少人数向けの飛行機」にある共通の性質「旅客が乗る」「空席率」などのクラスの性質を追加できます。
「少人数向けの飛行機」をさらに別々の特徴を加えて継承する「ヘリコプター」や「プライベートジェット」クラスを作ることができ、共通の部分は再利用し異なる特徴をまとめた新たな継承クラスを作っていくことができます。
ポリモーフィズム
共通の性質といってもまったく同じでないケースがあります。 継承した性質を元とは違う働きにできます。
航空機の例では、「飛ぶ」性質は考え方として似ていても「旅客機」と「グライダー」では中身が大部違います。 ジェットエンジンを使って飛ぶのか、もっと少ない力で飛ぶのか、大量のジェット燃料を使い断続的に加速するのか、最初だけ加速してあとは滑空するのに任せるのか、中身はいろいろです。
同じ「飛ぶ」メソッドでも中身は異なり、与える燃料や力加減に関する情報も違ってくるでしょう。継承した「飛ぶ」性質を異なるやり方で実現できるのがオブジェクト指向プログラミング言語が備えるポリモーフィズムの性質です。
カプセル化
カプセル化の機能は、オブジェクトの中身の詳細を明かさず、シンプルに使えるようにします。
飛行機の例では、「飛ぶ」過程でさまざまなオブジェクトが互いに連携してプログラムを動かしていくと思われますが、「機長」オブジェクトと「キャビンアテンダント」オブジェクトは互いに連携しても知っている情報やアクションに違いがあるのが自然です。
機長は操縦桿を動かしますが、キャビンアテンダントは動かしません。 キャビンアテンダントは機内食の暖め方や残量を知っていても機長はおそらく詳細を知る必要はないでしょう。
オブジェクト指向プログラミング言語では、クラスや継承の位置関係等によりアクセス範囲を限定でき、情報の漏れを防いだり、誤って操縦桿を動かしてしまうことを防げます。
オブジェクト指向の代表的なプログラミング言語
Python
Pythonは高水準の汎用プログラミング言語でオブジェクト指向を含むさまざまなスタイルに対応しています。 設計思想は、大幅なインデントを使用してコードの読みやすさに特徴があります。人気のあるプログラミング言語の1つとして常にランクインしている言語です。
Python言語でのオブジェクトは下記のようになります。
class Flayable: def fly(self): print(“I can fly.”) class Plane(Flayable): def __init__(self): self.fuel = 0 self.model = “” my_jet = Plane()my_jet.fly() |
Pythonの特徴や学習方法などの詳しい情報は関連記事の中でまとめていますので、ぜひこちらの記事をご覧ください。
関連記事:Pythonとは?特徴や学習方法などを他言語と比較しながら解説
C言語
C言語は1970年代にデニス・リッチーによって作成され、現在でも広く使用される汎用プログラミング言語です。C言語の特徴は、対象となるCPUの性能を忠実に反映するように設計されていて実行が速い点です。 C言語は手続き型言語で、静的型システムを備え構造化プログラミングに対応しています。 メモリへの直接的なアクセスができ、機械命令に効率的に置き換えられる言語構造を提供しています。標準準拠のCプログラムは、さまざまなコンピュータで動く移植性の高さに特徴があります。
C言語にはオブジェクト指向の文法が備わっていないためオブジェクト指向のプログラミングをする場合はC++言語など他のプログラミング言語を使うことが多いでしょう。
フリーランスのc言語エンジニアの仕事内容や年収については関連記事の中でまとめていますので、ぜひこちらの記事をご覧ください。
関連記事:フリーランスC言語エンジニアの仕事内容とは?平均年収、目指す方法などをご紹介
C++
C++はデンマークのコンピュータ科学者が作成した高水準汎用プログラミング言語です。C言語の特徴に加えC++はオブジェクト指向などを搭載し幅広い環境で利用できます。 C言語は手続き型言語なのに対して、C++言語ではオブジェクト指向のプログラミングを自然に記述できます。
class Flyable { public: void fly() { cout << “I can fly\n”; }} class Plane: public Flyable { public: int fuel; string model;} int main() { Plane my_jet; my_jet.fly(); return 0;} |
フリーランスC++エンジニアの詳細やC言語との違いついては関連記事の中でまとめていますので、ぜひこちらの記事をご覧ください。
関連記事:フリーランスC++エンジニアの将来性は?C言語との違いやフリーランスの案件例をご紹介
Ruby
Rubyは、 1990年代半ばに、日本のまつもとゆきひろ氏によって開発された動的型付け言語で、オブジェクト指向を含む複数のプログラミングパラダイムをサポートする高水準の汎用プログラミング言語です。 簡潔にコードを記述できオブジェクト指向の設計が中心にあることやWebサービスでの利用例が多い言語です。
class Flayable def fly puts “I can fly.” endend class Plane < Flayable def initialize @fuel = 0 @model = “” endend my_jet = Plane.newmy_jet.fly |
Rubyの特徴やRubyで作られたサービスについての情報は関連記事の中でまとめていますので、ぜひこちらの記事をご覧ください。
関連記事:Rubyで出来ることとは?特徴やRubyで作られたサービスをご紹介
Java
Javaは、高水準のオブジェクト指向プログラミング言語です。もともと1995年5月にサンマイクロシステムズのJavaプラットフォームの中核としてリリースされたました。 OSやハードウェア環境への依存ができるだけ少なくなるように設計されているため小型機器からスマートフォン、パソコンや家電、大型コンピュータまで幅広い環境で書いたプログラムが動作するのが特徴です。Webアプリケーションの開発にも使われ、多数の開発者がいます。
JavaとJavaScriptは、名前、文法など似ているところもありますが2つの言語は別物です。
class Flyable { public void fly() { System.out.println(“I can fly.”); }} class Plane extends Flyable { int fuel; String model;} class testfly { public static void main(String args[]) { Plane my_jet = new Plane(); my_jet.fly(); }} |
Javaの特徴やできることについての詳しい情報は関連記事の中でまとめていますので、ぜひこちらの記事をご覧ください。
関連記事:Javaは何ができる言語なのか?できることや汎用性の高さをご紹介
JavaScript
JavaScriptは元々Webサイトで用いられるプログラミング言語で、 現在では標準に準拠した高水準のコンパイル言語で、動的型付けプロトタイプベースのオブジェクト指向プログラミング言語です。特長は関数を変数に代入でき、イベント駆動型、関数型、命令型などのいろいろなスタイルをサポートするマルチパラダイム言語です。
const flyable = { fly() { return “I can fly.”; }}; const plane = { __proto__: flyable, fuel: 0, model: “”,}; console.log(plane.fly()); |
JavaScriptの特徴やJavaとの違いについては関連記事のなかでまとめていますので、ぜひこちらの記事をご覧ください。
関連記事:JavaとJavaScriptとの違い、それぞれの特徴や名前が似ている理由について
Scratch
Scratchは子供を対象としたプログラミング環境です。 70以上の言語に翻訳され、世界のほとんどの地域で利用されています。 特長はプログラミングの教育ツールとして開発され、ブロックベースのビジュアルプログラミングができます。
スクラッチの名前はディスクジョッキーがアナログレコードをターンテーブルで操作していろいろな効果音や音楽を作り出す技法に由来しています。Scratchではゲームやアニメーション、音楽、シミュレーションなどのマルチメディアをリミックスしてプログラミングできます。
オブジェクト指向のメリット
具体的なオブジェクト指向プログラミング言語の例を見てきました。次にオブジェクト指向でプログラミングするメリットを見ていきましょう。
複数人で開発がしやすい
オブジェクト指向では、共通の性質をもつものをオブジェクトとして扱いプログラミングします。 カプセル化の機能によりオブジェクトの中身を知らなくてもオブジェクトを使用できます。
オブジェクトによってプログラミングの領域を切り分けることができ、プログラミングを分担しやすいです。 また、適切に設計されていればオブジェクトの使い方は理解しやすく構造化プログラミングより既存のコードが理解しやすくチームに加わりやすくなります。
作業効率が高い
プログラムの動作にエラーが発生したときに、 膨大なプログラムのなかでバグがある部分、まずは原因を調査する必要があります。 オブジェクト指向でプログラミングがされていないと、エラー部分を突き止めるのに時間がかかりますが、 オブジェクト指向ではモノとアクションが切り分けられているので、エラー時にオブジェクトを触っていたか、何のアクションをしていたか、アクション毎にコードが分かれているのでエラー箇所が特定しやすくなっています。
また、継承の機能を使ってオブジェクトを拡張するなど 再利用性の高いプログラミングができるので、無駄なコードを省いて効率的にプログラミングできます。
メモリの軽量化がしやすい
オブジェクト指向のプログラミングでは、必要に応じてメモリ使用量を抑えることができます。 クラスの設計を見直し、不要な属性を継承しないように工夫したり、インスタンスの数が増えないようコントロールしメモリ使用量を抑えられます。 プログラム全体を見通して問題を切り分け、どうオブジェクトにしていくか設計の役割が重要です。
ただし組込み分野など、メモリ使用量の制約が大きい環境では、C言語など構造化プログラミングが用いられることもあります。
オブジェクト指向のデメリット
コードが複雑になる
オブジェクト指向のプログラミングは オブジェクトを通じて処理をコーディングしていきます。
設計によってはクラス1とクラス2がほとんど同じ処理をしていることが発生します。 オブジェクト指向のプログラミングではない場合は、同じ処理を一つにまとめたりできますが、オブジェクト指向のプログラミングでは共通だからといってクラスの設計をあとから共通化するのは困難です。
無駄なコードにならないよう、プログラミングの前の設計や、プログラムにオブジェクトを追加する際に既存のコード理解が必要です。
習得難易度が高く難しい
オブジェクト指向のプログラミングには、知識と経験が必要です。
構文の理解はもちろん必要ですが、オブジェクト指向のプログラミングで重要な設計の段階で、継承やポリモーフィズム、カプセル化などへの理解があとのプログラミングで使いやすくコーディングしやすいかを大きく左右します。
オブジェクト指向のプログラミングは奥が深く、オブジェクト指向のプログラムを書くことを習得して終わりではありません。うまくオブジェクトの設計ができるようになるには多くの経験が必要です。
だからこそ、オブジェクト指向のプログラミングをきちんと習得したエンジニアは希少性があり就職や転職活動で有利になります。
オブジェクト指向の開発規模
オブジェクト指向のプログラミングはいろいろな応用ができさまざまな分野で使用されます。 なかでも大規模なシステムではオブジェクト指向のもつ開発効率や分業のしやすさなどから採用例が多いです。
規模の大きい著名オープンソースプロジェクトの例:
- 画像分析ライブラリの OpenCV は約70万行のC++言語と約22万行のC言語他のソースコードで構成されています。
- 2Dゲーム制作ライブラリの cocos2d-x は約46万行のC++言語のソースコードが使用されています。
オブジェクト指向の学習方法
プログラミングスクールで学ぶ
オブジェクト指向のプログラミングを学ぶ方法の一つはプログラミングスクールの利用です。
プログラミングスクールはわからない点を質問できたり、同じスクールの仲間ができるなど他の方法にはないメリットがあります。 特に質問できるのは独習だと得られない利点なので、つまづきを解消する大きな力になってくれるでしょう。
学習サイトで学ぶ
二つ目の学習方法は、オンライン学習サイトの利用です。
オブジェクト指向のプログラミングには複数の学習サイトが対応しています。 無料で学べるサイトもあり、有料でも月額1,000円程度で気軽に利用できます。
- JavaScript オブジェクト入門 – ウェブ開発を学ぶ | MDN ではJavaScriptを通して、オブジェクトの基本的な使い方を学べます。
- Javaのオブジェクト指向入門 はJava言語でオブジェクト指向のプログラミングを一通り学べるコンテンツです。
- 「オブジェクト指向」が学べる動画一覧(62動画) | プログラミング学習サイト【paizaラーニング】 はオンライン学習コースで、オブジェクト指向のプログラミングのいくつものコンテンツが用意されています。
- オブジェクト指向(エンジニア)の学習ならオンライン動画授業・講座のSchoo(スクー) は動画を通してオブジェクト指向を学べます。
書籍で学ぶ
三つめは書籍を読んで学ぶ方法です。書籍のメリットはまとまった情報が得られることです。 Webサイトを検索したりして断片的な情報を集めるよりも、効率的に学べるでしょう。
近年はサンプルコードをダウンロードできる書籍などもあるので便利です。以下に三冊ご紹介します。
- オブジェクト指向でなぜつくるのか 第3版 知っておきたいOOP、設計、アジャイル開発の基礎知識 | 平澤 章 は特定の言語ではなく、オブジェクト指向プログラミングのコンセプトを理解できる一冊です。
- Java1年生 体験してわかる! 会話でまなべる! プログラミングのしくみ | 森 巧尚 はJavaの学習を通して、オブジェクト指向のプログラミングを学べます。
- オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 | Sandi Metz, 髙山 泰基 はRuby言語を題材に、オブジェクト指向で再利用性の高いプログラミングをする実践的な方法がガイドされています。
まとめ
本記事ではオブジェクト指向、他のプログラム方法との違い、オブジェクト指向のプログラミングで重要な概念と原則、主なプログラミング言語や導入のメリット、利用例、学習方法などを見てきました。
オブジェクト指向のプログラミングはほとんどのプログラミング現場で利用される、重要なコンセプトですので、文法だけでなく設計までできるより深い理解をしていくと多くの現場で役立てられます。 オブジェクト指向の概念をより深く理解する機会を設けてみてはいかがでしょうか。
フリーランスの案件をお探しの方はTechReachにご相談ください。
TechReachを運営する株式会社アールストーンはIT・Web業界特化で15年以上の実績がございます。
そのため、高単価・高品質な数多くの案件紹介が可能です。
また一人のコンサルタントが企業と求職者様の担当を行う「両面型エージェント」を採用しているため、あなたの希望に合う案件がきっと見つかるはずです。
TechReachを活用して、理想の案件を見つけましょう!