今回は、抽象化について見ていきたいと思います。
抽象化とは
抽象化は、複雑なシステムや問題を単純化し、重要な部分だけに焦点を当てるプロセスです。具体的には、詳細な実装の内部機構や複雑な手順を隠し、システムや問題の本質的な特徴や機能に注目することを指します。
抽象化の特徴や利点
- 詳細の隠蔽: 抽象化により、システムの詳細な内部実装が隠蔽されます。これにより、システム全体の理解が容易になります。また、異なるコンポーネントやモジュールの独立性が高まり、変更や修正が容易になります。
- 抽象化レベルの定義: 抽象化は、システムの異なるレベルで行われます。上位レベルでは、高度に抽象化された概念やインタフェースが使用され、下位レベルでは具体的な実装や詳細が考慮されます。これにより、システムをモジュール化し、再利用性を高めることができます。
- 複雑性の管理: 抽象化により、複雑なシステムや問題を簡略化し、重要な要素に絞ることができます。これにより、システム全体の複雑性を管理し、理解しやすくなります。また、複雑性を分割して扱うことで、開発プロセスやデバッグが容易になります。
- 機能の階層化: 抽象化は、システムの機能を階層化する手段としても使用されます。システムを基本的な機能や操作に分解し、それらを組み合わせることで複雑な機能を実現します。階層化された抽象化は、ソフトウェアのモジュール化や再利用性の向上に貢献します。
抽象クラスを使った例
Animal クラスを抽象クラス(上位レベル)として宣言し、makeSound() メソッドを抽象メソッドとして定義しています。抽象メソッドは、サブクラス(下位レベル)で具体的な実装を提供する必要があります。Animal クラスは抽象メソッドの他に、具体的な実装を持つ sleep() メソッドも提供しています。Dog クラスと Cat クラスは Animal クラスを継承し、makeSound() メソッドをオーバーライドして具体的な動作を定義しています。
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public abstract void makeSound();
public void sleep() {
System.out.println(name + " が寝ています。");
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
public void makeSound() {
System.out.println(name + " はワンワン");
}
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
public void makeSound() {
System.out.println(name + " はにゃにゃー");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog("ココ"); // インスタンス作成時の型を見てください。(ポリモフィズム)
dog.makeSound();
dog.sleep();
Animal cat = new Cat("ムギ");
cat.makeSound();
cat.sleep();
}
}

