プログラミングを深く知るための第一関門、「オブジェクト指向」とは?
プログラミングで使う言語にはさまざまな種類がありますが、言語の基本的な表現の作法は3種類に大別できます。
中でも現在主流となっているプログラムの表現手法が「オブジェクト指向」です。
ここでは、初学者プログラマーに向けて、プログラミングを深く理解する上での第一関門、オブジェクト指向について解説します。
Contents [hide]
そもそもオブジェクト指向とは
プログラミングとは、コンピュータを思い通りに動かすため、コンピュータが理解できる言語を使って処理手順を指示する“作業マニュアル”作りのことを呼びます。
機械であるコンピュータに作業内容を伝えるには、人間同士で情報を伝達する手段とは異なる独特の表現形式があります。
その「プログラムの表現形式」には大きく3つありますが、その中で現在の主流となっているのが「オブジェクト指向」です。
オブジェクト指向には明確な定義はありませんが、ざっくり説明すると、「『オブジェクト』と呼ばれるソフトウェアの部品を、組み合わせながらプログラムを作っていく手法」です。
オブジェクトの内部で、どのような手順で処理が行われているのか細かいことは一切考えずに、オブジェクトの機能だけに注目。
プログラム全体を粗くとらえてソフトウェア開発を進める点がこの手法の肝です。
例えば、人間の体を思い浮かべてみましょう。
心臓や肺、胃、目、耳など、人間の体はさまざまな器官の組み合わせで構成されています。
これらの器官は、心臓ならば「血液を体中に届ける」というように、それぞれ体の中でどんな役割を担っているかを理解するのは容易です。
一方で、器官をさらに細分して細胞として捉えた場合、細胞一つひとつが人体全体の仕組みにどのように影響しているか想像できるでしょうか。
おそらく器官ごとに役割を考えた方が、体全体の働きや構造を理解しやすいはずです。
このように、全体の設計を行う上で、役割を定義した部品の組み合わせで考える方が好都合な場合もあります。
この切り分けた部品がオブジェクトです。
オブジェクト指向プログラミングのパイオニアとしてコンピュータ界のノーベル賞と言われる「チューリング賞」を受賞したアラン・ケイ氏は、「生物が複雑な体を作り上げるための手法をまねて作り出したのがオブジェクト指向です」と語っています。
オブジェクト指向のプログラミングは、プログラムに要求される機能が高度化し、しかも短期間での開発が求められるようになったことで広く普及しました。
商用プログラミング言語としてよく使われる「C++」、様々なプラットフォーム上で動作するプログラムを作るための「Java」、Windows系システムの開発で利用する「.NET」、ウェブコンテンツに動きを与える「JavaScript」や「Ruby」、Mac OSやiOSのアプリ開発で使われる「Swift」など、これらはみなオブジェクト指向のプログラミング言語です。
ちなみに、オブジェクト指向以外のプログラムの表現手段として、「プロセス指向」と「データ指向」があります。
これらとの位置付けをざっくり言えば、歴史上最初に登場したプログラムの表現手法がプロセス指向、大規模プログラムの開発に向く開発効率に優れた現在の主流がオブジェクト指向、並列化に向いており性能向上に有利な点が多いため、これから注目されそうなのがデータ指向と言えるかもしれません。
理解を阻む専門用語、「クラス」「メソッド」「インスタンス」・・・
オブジェクト指向は、プログラミングの基礎中の基礎でありながら、プログラミングを始めている人でも、理解している人が意外と少ないと言われています。
その理由のひとつとして、そもそもこの概念を説明するために使われている用語が抽象的でとっつきにくいことが挙げられるでしょう。
そこで、まずはオブジェクト指向を学ぶ上で欠かせない用語について解説します。
オブジェクト指向では、プログラムに盛り込みたい機能を持ったオブジェクト(部品)を用意してプログラミングをしていきます。
オブジェクト同士を結び付けるためには、「要求」と「回答」というメッセージのやり取りの記述が必要です。
オブジェクトは、複数の「データ」と複数の「操作」で書かれた一種のミニプログラムで構成されています。
このうちデータは「属性」または「プロパティ」、「フィールド」と呼ばれる場合もあり、通常は汎用性を持たせるために変数で表現されています。
一方、操作は「メソッド」とも呼ばれ、複数の操作を組み合わせた、受け取ったメッセージに対するオブジェクトの挙動を「振る舞い」と呼びます。
一般に、オブジェクト指向のプログラミングでは、ソフトウェアメーカーが提供する開発環境に含まれるオブジェクト(用意されたオブジェクト集を「クラスライブラリ」と呼びます)を利用し、それを組み合わせながらプログラムを作ります。
これは、ちょうど玩具のレゴ・ブロックの部品を使って、飛行機やお城を作るのに似ており、より大きな部品を用意しておけば、簡単な組み立てで、より高度なプログラムの作成が可能です。
ただし、ソフトウェアメーカーが用意しているオブジェクトは、そのまま使える形ではなく、利用目的に合ったオブジェクトを作るためのひな型になっています。
これを「クラス」と呼び、クラスをカスタマイズして実際のプログラムに組み込んだオブジェクトのことを「インスタンス」と呼びます。
インスタンスを日本語に訳せば実体化という意味で、クラスに含まれる「属性」を設定し、仕上げます。
オブジェクト指向が持つ重要な3つの性質
オブジェクト指向は、プログラムの再利用とメンテナンスを容易にするため、3つの重要な性質があります。
ここにも、一般には聞き慣れない専門用語が使われているので、キッチリと説明していきます。
カプセル化
まずは、「カプセル化」です。
これは、クラスから作り出したインスタンス内部のデータ(属性)を勝手に変更できないようにアクセス制限をかけて保護することを指します。
大規模なプログラムの開発では、多くのメンバーが役割分担しながら進めることが多いことでしょう。
メンバーのうちの1人が勝手にデータを変えてしまったら、動作確認できているか分からず、プログラムの不具合の原因にもなります。
そのため、動作確認済みのプログラムにカプセル化を施すのです。
ただし、インスタンスの中には、変更できるようにしておくべきデータが含まれる場合もあります。
こうしたデータはカプセル化する領域とは区別して、アクセス制限を解除しておくのが一般的です。
継承
「継承」は、よく似た振る舞いをするクラスをたくさん作る際に、たたき台となるクラスから、効率的に派生版クラスを作り出せる性質を指します。
これにより、新たなクラスが必要になった場合は一から記述する必要がなく効率的です。
また、人為的ミスも減るため、不具合が発生しにくくなるメリットも生まれます。
なお、派生版クラスは、カプセル化から外しておいた、アクセス制限していない部分のデータやメソッドを変えて作ります。
ポリモーフィズム
「ポリモーフィズム」は、日本語に訳すと「多様性」という意味で、オブジェクト指向のプログラミングをする際に、さまざまなオブジェクトの振る舞いから、似た振る舞いをひとまとめにしてプログラムをすっきりさせることを指します。
例えば、食べ物の価格を表示させるプログラムを考えてみます。
この際、中トロは“300円”、イカは“100円”、ウニは“350円”というように、寿司の価格でクラスを作成すると、後からラーメンの価格を表示するプログラムを追加したい場合は、クラスを別で用意しなければなりません。
これではプログラムが複雑化してしまいます。
そこで、メニューの価格という共通した性質に注目してみます。
すると、プログラムが1つにまとまってスッキリする上、後からの追加も簡単です。
これが、ポリモーフィズムの考え方です。
オブジェクト指向をもっと理解するためのおすすめ書籍を紹介
ここまでオブジェクト指向の基礎部分を紹介しましたが、より深く学びたい人はウェブのブログ記事の閲覧や技術書の購入をおすすめします。
ブログ記事の場合、解説の手法は割と似ているのですが、抽象的な概念を説明する際の切り口がそれぞれの筆者ごとに工夫されているので、複数のサイトを見て自分の感性に合ったもの選びましょう。
また、オブジェクト指向に関する書籍は数多く出版されていますが、初心者用と言いながら、初心者が読むにはハードルが高いものも散見されます。
以下、比較的平易に説明されている書籍を3つ紹介します。
参考書籍1
『オブジェクト指向でなぜつくるのか 第2版』
著者:平澤 章
出版社:日経BP
オブジェクト指向の全体像とそこに含まれる各技術の核心を、比較的平易な文章で解説しています。
コンピュータの中で、オブジェクト指向で記述されたプログラムがどのように処理されるかについて、処理の仕組みも解説されています。
参考書籍2
『オブジェクト指向入門 (ASCII SOFTWARE SCIENCE Programming Paradigm)』
著者:Bertrand Meyer、酒匂 寛、酒匂 順子
出版社:アスキー
入門書となっていますが、どちらかと言えば、一通りオブジェクト指向を知っている人が、より理解を深めるための内容になっています。
参考書籍3
『オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)』
著者:アラン・シャロウェイ、ジェームズ・R・トロット
翻訳:村上雅章
出版社:丸善出版
この本は、第一線のプログラマーの視点からの、オブジェクト指向が持つ本質的な利点をフル活用して、より高効率に高性能なプログラムを開発したい人に向けた内容です。
現役プログラマーも今一度オブジェクト指向の概念を把握しよう
2020年度から、小学校でのプログラミング教育が英語教育と共に義務化され、ITの知識は語学と並んで人材価値を高める重要なスキルになりました。
終身雇用や年功序列の人事制度が崩れていく中で、現役のビジネスマンもこれから育つ新しい世代に競り負けないスキルを身に付けなければなりません。
オブジェクト指向はプログラムの基礎となる考え方です。
簡単なプログラミングの実技なら深く理解しなくても大丈夫かもしれませんが、開発効率を高め、高性能なプログラムを開発するためには、やはりオブジェクト指向についてキッチリと理解しておくべきでしょう。
プログラマー初学者はもちろん、第一線で活躍中のプログラマーも今一度基本に立ち返ってスキルアップを図ってみてはいかがでしょうか。
ほかにも、さまざまな「スキルアップ支援」をご用意しています。
資格取得、研修受講など、ご希望に合わせてぜひご活用ください。