オブジェクト指向とは
ソフトウェアの保守性や再利用性の向上を目的とした技術。
1つ1つの部品の独立性を高めて、それらを組み合わせて開発していく考え方に基づいている。
OOP(オブジェクト指向プログラミング)が生まれた背景
OOPは、それ以前のプログラミング技術の欠点を補うために生まれた。
OOPが生まれるまでのプログラミング言語の変遷(古い順)
言語 | 説明 | 問題 |
機械語 | コンピュータが直接解釈・実行可能な言語。 | 人間にわかりにくい |
アセンブリ言語 | 機械語を、人間に分かりやすくするために文字列や記号で記述された言語。 | まだ人間にわかりにくい |
高級言語 (高水準言語) | より高級な文法でできた、複数の機械語をまとめた言語。 | 時代に求められる生産性や品質に追い付かない(ソフトウェア危機が浮上した時代) |
構造化言語 (構造化プログラミング) | ・基本三構造(順次進行・条件分岐・繰り返し)を提供し、より関数の独立性の強化した言語。 ・GOTO文は非推奨。 | ・低い保守性と再利用性 ・グローバル変数を多用せざるを得ない仕組み |
つまり、OOPは構造化言語(構造化プログラミング)の問題を解消するプログラミング言語として、以下の仕組みを備えて生まれた。
- 保守性と再利用性を高める
- グローバル変数を使用する必要がない
OOPの3つの仕組み
課題であったソフトウェアの保守性・再利用性の向上を、カプセル化(クラス)・ポリモーフィズム・継承の3つの仕組みを組み合わせることで実現した。(グローバル変数を使わずに済む仕組みはクラスで解消)。
カプセル化(クラス)
関連性の高い関数と変数を、クラスとして1つにまとめる仕組み(もともとはバラバラに関数や変数が存在していた)。その結果、保守性の悪化要因となるグローバル変数を使う必要がなくなったり、継承やポリモーフィズムも使用可能なので、クラス内のロジックをシンプルにできるようになった。
継承
関連性のあるクラスの同じ点と異なる点を整理して、重複するコードを統一する仕組み。スーパークラスと呼ばれる継承元のクラスの変数やメソッドを、継承先のサブクラスは使用することができる。
ポリモーフィズム
クラス内の関数を呼び出す側のロジックを同じにして、重複するコードを統一する仕組み。
以下の例でいくと、呼び出す側(class Feed)のロジックを共通にすることで、DogとCatのeatメソッドをどちらも呼び出せる仕組みになっている。ちなみに、DogとCatクラスはAnimalクラスを継承している。
ポリモーフィズムの例
// スーパークラス
class Animal {
abstract String eat();
}
// サブクラス1
class Dog extends Animal {
String eat(){
return "dog food";
}
}
// サブクラス2
class Cat extends Animal {
String eat(){
return "cat food";
}
}
// 引数animalにサブクラスをとり、animal.eat()という1つの実行文でどちらのサブクラスのeat()も実行できる。
class Feed {
void execute(Animal animal) {
System.out.printIn(animal.eat());
}
}