プログラミングに興味のある方はオブジェクト指向プログラミングという言葉を聞いたことがあるのではないでしょうか。
ただ、聞いたことがあっても、なんとなくしか理解していないという方も多いかと思います。
本記事では、以下の6点について解説していきます。
- オブジェクト指向とは?
- オブジェクト指向プログラミングって?
- オブジェクト指向のどんなメリットがある?
- オブジェクト指向の主なプログラミング言語は?
- オブジェクト指向でないプログラミング言語とは?
- オブジェクト指向を学ぶポイント
圧倒的スキルが身につくプログラミングスクール5選
- DIVE INTO CODE
・年齢制限なし
・現場レベルの技術や開発が学べる
・オリジナルのWebアプリケーションが作れる - RUNTEQ
・高クオリティーで人気急上昇中!
・800~1,000時間の圧倒的な学習量
・現役エンジニアによるオリジナルポートフォリオ作成支援
・何でも相談できるバディ制度 - DMM WEBCAMP
・転職成功率98%・離職率2.3%
・転職できなければ全額返金。
・DMM.comグループならではの非公開求人も多数 - ディラボ
・Javaに特化し「未経験が2ヶ月でJavaシルバー資格取得可能」
・1期10名しか入れない「ガチの開発エンジニア育成スクール」
・平日でも土日でも基本的に質問し放題!
・卒業後現場の最前線で活躍できるスキルが身につく - Aidemy Premium
・AIに特化したプログラミングスクール
・完全初心者から研究者クラスまでに対応した幅広く優良なコンテンツ
・メンターと学習進捗を一緒に計画し挫折しないシステム
・20代には特待生制度アリ!
オブジェクト指向とは?
プログラミングはそもそもプログラムを作ることです。
プログラムを作ることはコンピュータが理解できる言葉を並べて、プログラマの意図したとおりの順番でコンピュータが動作するようにすることです。
このとき、プログラムをどのように表現するかにも色んな種類があります。
代表的なものは以下のとおりです。
- オブジェクト指向プログラミング
「モノ」を組み立てるように表現して、コンピュータに動作をさせる - 手続き型プログラミング
上から下まで単調なルールで文章を読むように動作する - 関数型プログラミング
数学の関数のイメージでデータに何かしらの処理をして答えを取得するように動作する
オブジェクト指向についてもう少し簡単に説明していきます。
プログラミングをわかりやすく!
オブジェクト指向を最初に代言したのは、1970年代にプログラミング言語SmartTalkを開発した計算機科学者アラン・ケイ氏といわれます。
その背景にはコンピュータ技術が急速に発展するなかでプログラミングが複雑化する環境がありました。
目的に合ったプログラムを書くためには甚大な行数のコーディング(プログラムを書くこと)が必要となり、分業も困難となる。
そうすると、プログラミングをするのに非常に時間がかかります。
この解決策として彼が打ち出したのはプログラミングを「モノの集まり」としてとらえる発想でした。
オブジェクト=モノ?
直訳すれば「物」「対象」という意味になります。
プログラミングにおいてはデータと処理の集まりを意味しています。
オブジェクト指向ではプログラムを「データと処理の集まり」と考えていきます。
プログラムのなかのオブジェクト=モノとは?
一例として3Dモデルで一つの都市を構築する場合を想像してみてください。
例えば2階建て以上の部屋から外の風景を見る感じです。
オブジェクト指向以前の考え方では、建物や道路やその上を走る自動車などを同じ「モノ」として捉えて以下のように区別してませんでした。
- 四角くて白い物体にいくつかの穴が開いている物体=建物
- 幅のある平らなライン=道
- 箱に4つの可動性の輪がついている=自動車
を羅列するような方法がとられていました。
これに対して、オブジェクト指向ではまず「建物」「道」「自動車」と名前をつけた「モノ」を用意するところから始めます。
そのあとに、「建物」には「四角い」「コンクリートでできている」「なかは部屋で分かれている」特徴がある、と定義していくのです。
オブジェクト指向が生まれる前は都市は「ひとつの連続したプログラム」で、「『自動車』だけは他の人に頼む」などの方法がとりづらい状況にありました。
一方でオブジェクト指向では、「都市」を「建物」「道路」「自動車」などの「オブジェクト化された個々のプログラムの集合」と捉え、一つ一つを切り離して作ることができます。
これが従来の方法とオブジェクト指向の違いです。
プログラミングを便利かつ合理的にしていく考え方をオブジェクト指向といえるでしょう。
オブジェクト指向プログラミングの4つの基本概念
引用元:日経クロステック(xTECH)
オブジェクト指向プログラミングには、以下の4つの基本概念があります。
- カプセル化
- 抽象化
- 継承
- ポリモーフィズム
「なんか複雑?」って思えるかもしれませんが、動作の大まかなメカニズムを把握しておくと、コンピュータープログラムの基本を理解することができます。
次に、4つの基本的な理論とそれらの意味を見ていきましょう。
カプセル化
プログラム内では、さまざまなオブジェクト同士が自動的に情報を交換しようとします。
オブジェクト同士のこうしたやり取りを止める場合には、個々のクラス内でのカプセル化が必要です。
カプセル化を通じて、クラスがオブジェクト内の特定の変数や関数に変更を加えたり、やり取りをすることはできません。
カプセル化の原理は、液状や粉状の医薬品を包むカプセル剤と同じで、情報(オブジェクト)の周囲にコードの他の部分から分離するためのデジタルの保護壁を形成します。
このオブジェクトは、同じプログラムや他のプログラムの別の部分に複製することができます。
抽象化
抽象化は、カプセル化の拡張形のようなもので、特定のプロパティやメソッドを外部のコードから隠して、オブジェクトのインターフェイスをシンプルにします。
抽象化を使うメリットはいくつもありますが、総じてコードに対する変更の影響を限定するのに役立ちます。
これは、問題が発生した場合に、特定の変数にのみ変更の影響が及び、外部のコードは影響を受けないようにすることで実現されます。
継承
継承の概念を使うことで、コード内にある既存のクラスの機能を拡張できるため、コードの反復をなくすことができます。
たとえば、テキストボックスや選択フィールド、チェックボックスのようなHTMLコードの要素には、特定のメソッドと一定のプロパティが備わっています。
あらゆるタイプのHTML要素用にプロパティやメソッドを何度も定義する代わりに、総称オブジェクトを使えば一度で定義することができます。
その総称オブジェクトに「HTMLElement」(HTML要素)といった名前を付けることで、他のオブジェクトにプロパティとメソッドが受け継がれるため、不要なコードを減らすことができます。
主体となるオブジェクトはスーパークラスになり、それに従うすべてのオブジェクトはサブクラスとなります。
サブクラスでは、スーパークラスから必要な要素を加えつつ、別の要素を持つことができます。
ポリモーフィズム
「多くの形式または形状」という意味を持つこの手法を使うと、複数のHTML要素をオブジェクトのタイプに応じて表現することができます。
この概念により、処理方法や処理の部位を変えることによって機能をさまざまに定義することが可能になっています。
ポリモーフィズムを実現する仕組みとして、オーバーライドとオーバーロードがあります。
オブジェクト指向のメリットとは?
オブジェクト指向は特定のプログラミング言語や手法の名前ではありません。
プログラミングを行う際の考え方のひとつです。
オブジェクト指向にはどういったメリットがあるのか解説していきます。
プログラミングの全体像を把握しやすい
「都市」の例に戻ると、従来の方法は「境目のない連続したコンピュータへの命令」としてプログラミングされるのに対し、オブジェクト指向では「建物と道路と自動車でできた場所」と認識できます。
プログラム全体の構造が明確に把握でき、実際の都市を設計するようなイメージでプログラムが設計できます。
まずは全体イメージ(ゴール)を考え、そのあとに順に考えていく……という企画の進め方ができます。
分業や共同作業がやりやすい
さらに都市の例で考えてみます。
全体のプログラムが連続していて区切りがない場合、複数のプログラマーが共同作業するのは難しくなります。
一方でオブジェクト指向なら「私は全体の構造をつくっていくので、あなたは建物をつくってください」とプログラムを切り分けながら分業作業を行うのがはるかにカンタンになります。
オブジェクト指向の登場は何百人ものプログラマーが関わる巨大システム実現に貢献したと言われています。
改良や修正がやりやすい
プログラミングの作業は当初計画したとおり一本道の工程で進むケースはほとんどありません。
たえず修正や変更を加え、行ったり来たりをくり返しながらゴールに向かう例がほとんどです。
たとえば、完成間近になってからすべての「建物」の屋上に「アンテナ」をつけたいと修正意見が出たとします。
「一つのつながり」のプログラムなら「すでにつくったすべての建物にアンテナのプログラムを一つ一つ挿入していく」作業が発生し、甚大な作業量になってしまいます。
一方でオブジェクト指向なら「建物」の定義に「アンテナ」を追加すれば、たった一つのアクションですべての「建物」を修正できます。
プログラムのなかに横串を入れるように一気に修正できるのがオブジェクト指向の特徴です。
プロセス次第でプログラミングを高速化や軽量化できる
オブジェクト指向のプログラミングは電子部品などの回路設計にも似ています。
「パーツとパーツをつなげて全体の機能を生み出していく」回路設計とおなじように
「全体プログラムをどのようにグルーピングして切り分けるか」
つまり構造をつくっていくのがプログラマーの重要な役割になります。
この考え方をすると、計算を大幅に高速化でき、メモリの軽量化も可能になります。
オブジェクト指向の主なプログラミング言語
C言語
C言語は「型」に支配された言語です。変数にも関数にも「型」が存在し、「型」という枠組みの中で厳密に情報が処理されています。
C言語はクッキー型のような形を決めるためのものであり、「データ型」とは、C言語における変数や関数の形を決めるためのものです。
このデータ型によって「情報のサイズ」や「情報の種類」を決めています。
C++
C言語が拡張されたプログラミング言語。
C言語では構造体(データをパッケージ化する機能)、関数(データを処理する機能)がそれぞれ別の機能として存在していたが、C++の「クラス」は構造体メンバ(クラスが管理するデータのこと)に関数も含ませることができるようになりました。
Python(パイソン)
プログラミング言語の1つ。
覚えやすく、初心者でも使いやすいためAI(人工知能)の開発、Webアプリの開発、スマホアプリの開発、ゲーム開発などに使用されています。
「YouTube、インスタグラム、Googleマップ」もPythonで作られています。
もっとも将来性のある言語と言えるでしょう。
Ruby(ルビー)
日本人が作成したプログラミング言語。コードの量が少ないので初心者も扱いやすい。
主にWEBアプリ制作に使用。
Scratch(スクラッチ)
プログラミング教材。コードは使用せず、積み木のように用意されたブロックを組み立てていく。
入力が苦手な子供もプログラミングができる。
オブジェクト指向でないプログラミング言語とは?
「オブジェクト指向が効率よく作業できる」ってわかり、
今後は「オブジェクト指向のプログラミング言語だけ」学べばいいのかというとそうでもないんですよね。
実際、現場で働いてるエンジニアさんの意見は、
関数型言語、LISP系(Common LISPやScheme、Clojure等)、ML系(Haskell等、ただし、OCamlのようにオブジェクト指向をサポートした言語もある)、Erlang処理系(Erlang、Elxir)等は一部で熱狂的な人気がありますし、好んで使っている人はいます。また、Cは古くから人気があり、今でも多くの場所で使われています。Goはまだ新しい言語ですが、すでにいろいろなアプリケーションが使われています。こういったオブジェクト指向をサポートしていない言語はまだまだ使われていますし、需要がなくなったとか、廃れてしまったと言うことはありません。(オブジェクト指向をサポートしていない言語ではオブジェクト指向の考えに基づいてプログラミングが出来ないというわけではありません。例えばGTK+はCで書かれていますが、オブジェクト指向の考えで設計されています。)
最近の言語の傾向として、多くのマルチパラダイムを採用していいとこ取りを目指すか、無駄なパラダイムや機能を省いて機能特化やシンプルさを目指すか、の二極化が進んでいると思います。いいとこ取りを目指すマルチパラダイムの言語のほとんどがオブジェクト指向をサポートしていますが、特定の目的の特化したり、シンプルさを目指す場合は、オブジェクト指向をあえて採用しない場合が多いように思えます。
2000年以降のいいとこ取りの主な言語(オブジェクト指向をサポートしている)
C#
D
Groovy
Scala
F# (.NET系の中の関数型より言語)
Rust
Dart
Kotlin
Swift
2000年以降のシンプルさ重視の主な言語(オブジェクト指向をサポートしない)Clojure (LISP系)
Go (Cの代替を目指し、シンプルさを重視している)
Elixir (Erlang VMで動くRubyライクな文法)
Julia (数学との親和性を重視)
オブジェクト指向をサポートしていない言語も、まだまだ強い存在感を示していると思います。なお、オブジェクト指向をサポートしているからと言って、オブジェクト指向の考えでプログラミングするかどうかはまた別の話です。
—
最後に、与太話として、Erlangこそが真のオブジェクト指向言語であるという話もあったりします。つまり、ErlangとElixir以外は全てオブジェクト指向言語ではない、世の中でErlangとElixirが使われているのはほんの一部だけ、よってオブジェクト指向以外の言語はまだまだ需要があると言うことです。
引用元:Quora
オブジェクト指向のプログラミング言語だけが良いってワケではなく、
「開発するプログラムの内容」
によるので、オブジェクト指向でないプログラミング言語だからって「役に立たない!」って事はないです。
オブジェクト指向を学ぶポイントとは?
オブジェクト指向に関する書籍は数多く出版されていますが、しっかりと身につけるには読書だけでなく、JavaScript、Python、Rubyなどのオブジェクト指向に対応したプログラミング言語を学ぶなかで覚えていくのが近道と言われます。
オブジェクト指向とは?オブジェクト指向プログラミングの例のまとめ
オブジェクト指向は『モノの関係性を作っていく考え方』ということが分かればスムーズに理解できます。
まずは、PythonやRubyなど「わかりやすい」と言われるオブジェクト指向のプログラミング言語に取り組んでみて、経験のなかで感じとるのが最短距離かもしれません。
ぜひオブジェクト指向のプログラミングができるようになりましょう!
関連
受講料安くて保証が手厚い!プログラミングスクールランキング
圧倒的スキルが身につくプログラミングスクール5選
- DIVE INTO CODE
・年齢制限なし
・現場レベルの技術や開発が学べる
・オリジナルのWebアプリケーションが作れる - RUNTEQ
・高クオリティーで人気急上昇中!
・800~1,000時間の圧倒的な学習量
・現役エンジニアによるオリジナルポートフォリオ作成支援
・何でも相談できるバディ制度 - DMM WEBCAMP
・転職成功率98%・離職率2.3%
・転職できなければ全額返金。
・DMM.comグループならではの非公開求人も多数 - ディラボ
・Javaに特化し「未経験が2ヶ月でJavaシルバー資格取得可能」
・1期10名しか入れない「ガチの開発エンジニア育成スクール」
・平日でも土日でも基本的に質問し放題!
・卒業後現場の最前線で活躍できるスキルが身につく - Aidemy Premium
・AIに特化したプログラミングスクール
・完全初心者から研究者クラスまでに対応した幅広く優良なコンテンツ
・メンターと学習進捗を一緒に計画し挫折しないシステム
・20代には特待生制度アリ!