Javaオブジェクト指向プログラミング(OOP)
オブジェクト指向(object oriented)と手続き型(procedural oriented)
プログラミング初期の方式は手続き型でした。文字どおり、最初からコードが記述された順番どおりに実行される方式で、コンピューターの処理構造に似ているため実行速度が速いです。しかし、プログラムが大きく複雑になると保守が難しくなり、決められた順序で入力する必要があるため、順序が変わると結果を導き出しにくくなります。そのため、大規模プロジェクトには適していません。
オブジェクト指向プログラミングは、オブジェクトという論理的な単位で実行される方式で、データの処理方法よりもプログラムが使用しているデータを重視します。処理速度は相対的に遅く、設計に多くの時間がかかることもありますが、コードの再利用性が高く、保守が容易です。分析から設計への移行もしやすいため、大規模プロジェクトに適しています。
オブジェクト指向プログラミングの代表的な言語にはJava、C#、Objective-Cなどがあり、手続き型言語にはC、Pascal、Fortranなどがあります。
オブジェクト(object)
オブジェクトとは、情報を効率的に管理するための論理的な単位だと言えます。オブジェクトは、属性(attribute)またはフィールド(field)と呼ばれる変数と、情報を処理する手順を記述したメソッド(method)で構成されます。
現実世界で私たちがよく目にするすべての物や生物、有形・無形の存在などに例えられ、オブジェクトとして表現できます。たとえば、人は名前、身長、体重、血液型などの特徴を持ち、食事、仕事、勉強などの行為をします。ここで特徴と行為をプログラミング的に表現すると、属性とメソッドになります。
クラス(class)
プログラムを書いていると、同じ形のオブジェクトを生成しなければならない場合があります。たとえば、会社で人事システムを作るとしましょう。このとき、複数の社員の属性は同じ形式のデータとして存在し、同じような種類の仕事をすることになります。複数の社員に対するオブジェクトを生成するために個別にプログラミングしなければならないとしたら、社員の人事異動が発生するたびにプログラムを変更する事態になるかもしれません。
そこでオブジェクト指向では、同じ種類のオブジェクトを作るためにテンプレート、つまりクラスを利用します。オブジェクトはクラスを基に生成され、同じクラスから生成されたオブジェクトはすべて同じ属性とメソッドを持ちます。
人事システムで考えると、各社員ごとに実際の名前や経歴などの属性に異なる値が入っているため、名前で検索したり、難易度や役割が少しずつ異なる仕事を割り当てたりできるようになります。
プログラミングは建物に例えられることがよくあります。ここでも建築に例えて説明すると、クラス(Class)は建物の設計図であり、建築設計図によって作られた建物をオブジェクト(Object)と見ることができます。
継承(inheritance)
継承とは、上位が持っているものを下位へ引き継がせたり、下位がそれを受け取ったりすることです。オブジェクト指向プログラミングでも同じように、上位オブジェクトが持つ属性とメソッドを下位オブジェクトへ引き継がせることを意味します。
継承を利用することでコードの再利用が可能になり、コードの重複を減らせます。その結果、保守のしやすさも得られます。
カプセル化(encapsulation)
オブジェクトは複数の属性と複数の機能を持っています。オブジェクトを使う側から見ると、ある機能が内部で実際にどのように処理されているのかを詳しく知る必要はなく、処理方法を知らなくてもオブジェクトを使ううえで支障はありません。どの値を入力するとどの出力値が得られるのかだけ分かればよいのです。この概念がカプセル化です。
より簡単に説明すると、車を運転する人はエンジンの動作や車輪が回る原理など、すべての動作方法を知っているわけではありません。しかし、ハンドルを使って方向を調整し、アクセルとブレーキを使って速度を制御できることは分かっています。このように、運転者は車の内部動作原理を詳しく知らなくても運転に支障がありません。カプセル化もこれと同じ考え方です。
カプセル化は、クラス内部に複数の属性と機能をまとめ、外部から任意にアクセスされないようにする保護装置だと言えます。Javaにおけるカプセル化の基礎はクラス(class)であり、このクラスには隠すべき情報(private)と公開すべき情報(public)を区別して記述できます。利用者は公開された情報にだけアクセスできるため、情報隠蔽(Information Hiding)が可能になります。
カプセル化について整理すると、次のとおりです。
- オブジェクトの属性とメソッドを一つにまとめ、実際の実装内容を外部に隠すことを意味します。
- 外部オブジェクトはオブジェクト内部の構造を知らず、オブジェクトが公開して提供する属性とメソッドだけを使用できます。
- 属性とメソッドをカプセル化して保護する理由は、外部からの誤った使用によってオブジェクトが損傷しないようにするためです。
- Javaは、カプセル化されたメンバーを公開するか隠すかを決めるために、アクセス修飾子(Access Modifier)キーワードを使用します。
多態性(polymorphism)
多態性とは、一つのインターフェースを互いに異なる形で実装し、状況に応じて異なる意味で動作できることを意味します。今後学ぶオーバーライド(overriding)がこれに該当します。
オブジェクト指向プログラミングでは、まず抽象(abstract)クラスを作成し、その抽象クラスを継承した下位クラスが、上位抽象クラスで定義された抽象メソッドを再定義、つまりオーバーライドします。さらに別の下位クラスがこの抽象クラスを再び継承し、抽象メソッドを再定義したとしましょう。このとき、2つの下位クラスはそれぞれ抽象メソッドを再定義しているため、呼び出し時に異なる動作を行えるようになります。
たとえば、図形という抽象クラスがあり、それを継承した三角形、四角形、円形という下位クラスがあるとします。図形にはdraw()という抽象メソッドがあり、それを各下位クラスが継承して再定義すると、同じdraw()を呼び出しても、下位クラスが何であるかによって異なる形の図が描かれることになります。

図形クラスは、下位クラスで図形を描くために使用できる抽象drawメソッドを持っています。この抽象メソッドを三角形、四角形、円形クラスでそれぞれ再定義することで、継承したクラスに応じてメソッド呼び出し時に異なる動作を行います。
参考
- http://hunit.tistory.com/151
- http://searchstory.tistory.com/entry/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90
- http://pacs.tistory.com/entry/C-%EC%83%81%EC%86%8D%EA%B3%BC-%EB%8B%A4%ED%98%95%EC%84%B1-Inheritance-Polymorphism