JavaにおけるOOPSの概念 – OOPSの例

オブジェクト指向プログラミングの概念は、プログラミングにとって非常に重要です。OOPSの概念についてのアイデアがないと、オブジェクト指向プログラミングモデルでシステムを設計することはできません。

オブジェクト指向プログラミングモデルとは何ですか?

オブジェクト指向プログラミングモデルは、オブジェクトの概念を中心に回ります。 オブジェクトとは何ですか? オブジェクトはクラスのインスタンスです。プロパティと関数を含みます。これらは現実世界のオブジェクトのようです。たとえば、車、家、ラップトップなどです。それらには特定のプロパティとアクションを実行するためのいくつかのメソッドがあります。クラスとは何ですか? クラスはオブジェクトの設計図を定義します。それらはオブジェクトのプロパティと機能を定義します。たとえば、ラップトップはクラスであり、あなたのラップトップはそのインスタンスです。

OOPSの概念

コアOOPSの概念は次のとおりです:

  1. 抽象化
  2. カプセル化
  3. 多態性
  4. 継承
  5. 関連付け
  6. 集約
  7. 構成

1. 抽象化

抽象化は内部の詳細を隠す概念であり、物事を単純な言葉で記述することです。例えば、二つの整数を足すメソッドがあります。そのメソッドの内部処理は外部の世界から隠されています。カプセル化や継承など、オブジェクト指向プログラミングで抽象化を達成するための多くの方法があります。Javaプログラムも抽象化の素晴らしい例です。ここではJavaが単純な文を機械語に変換し、内部の実装の詳細を外部の世界から隠しています。

さらに読む: OOPSにおける抽象化とは何ですか?

2. カプセル化

カプセル化は、オブジェクト指向プログラミングにおいて抽象化を実装するための技術です。カプセル化は、クラスのメンバーとメソッドへのアクセス制限に使用されます。カプセル化には、アクセス修飾子キーワードがオブジェクト指向プログラミングで使用されます。たとえば、Javaでは、privateprotected、およびpublicキーワードを使用してカプセル化が実現されます。

3. ポリモーフィズム

ポリモーフィズムは、オブジェクトが異なる状況で異なる振る舞いをする概念です。ポリモーフィズムには、コンパイル時ポリモーフィズムと実行時ポリモーフィズムの2つのタイプがあります。コンパイル時ポリモーフィズムは、メソッドのオーバーロードによって実現されます。たとえば、以下のようなクラスを持つことができます。

public class Circle {

	public void draw(){
		System.out.println("Drwaing circle with default color Black and diameter 1 cm.");
	}
	
	public void draw(int diameter){
		System.out.println("Drwaing circle with default color Black and diameter"+diameter+" cm.");
	}
	
	public void draw(int diameter, String color){
		System.out.println("Drwaing circle with color"+color+" and diameter"+diameter+" cm.");
	}
}

ここでは複数のdrawメソッドがありますが、それらは異なる動作を持っています。これは、メソッドのオーバーロードのケースです。すべてのメソッドの名前が同じで、引数が異なるためです。ここでは、コンパイラがコンパイル時にメソッドを呼び出すことができます。したがって、これはコンパイル時の多態性と呼ばれます。ランタイムの多態性は、オブジェクト間に「IS-A」の関係がある場合に実装されます。これは、サブクラスがスーパークラスのメソッドをランタイムの多態性のためにオーバーライドする必要があるため、メソッドのオーバーライドとも呼ばれます。スーパークラスの観点から作業している場合、実際の実装クラスはランタイムで決定されます。コンパイラは、どのクラスのメソッドが呼び出されるかを決定することができません。この決定はランタイムで行われます。そのため、ランタイムの多態性または動的メソッドディスパッチという名前が付けられています。

package com.journaldev.test;

public interface Shape {

	public void draw();
}
package com.journaldev.test;

public class Circle implements Shape{

	@Override
	public void draw(){
		System.out.println("Drwaing circle");
	}

}
package com.journaldev.test;

public class Square implements Shape {

	@Override
	public void draw() {
		System.out.println("Drawing Square");
	}

}

Shapeはスーパークラスであり、CircleSquareという2つのサブクラスがあります。以下はランタイムの多態性の例です。

Shape sh = new Circle();
sh.draw();

Shape sh1 = getShape(); //some third party logic to determine shape
sh1.draw();

上記の例では、JavaコンパイラはShapeの実際の実装クラスがランタイムで使用されることを知らないため、ランタイムの多態性です。

4. 継承

継承は、オブジェクト指向プログラミングの概念で、オブジェクトが別のオブジェクトに基づいているものです。継承はコード再利用のメカニズムです。継承されるオブジェクトはスーパークラスと呼ばれ、そのスーパークラスを継承するオブジェクトはサブクラスと呼ばれます。Javaでは継承を実装するためにextendsキーワードを使用します。以下はJavaでの簡単な継承の例です。

package com.journaldev.java.examples1;

class SuperClassA {

	public void foo(){
		System.out.println("SuperClassA");
	}
	
}

class SubClassB extends SuperClassA{
		
	public void bar(){
		System.out.println("SubClassB");
	}
	
}

public class Test {
	public static void main(String args[]){
		SubClassB a = new SubClassB();
		
		a.foo();
		a.bar();
	}
}

5. 関連

関連はオブジェクト間の関係を定義するOOPSの概念です。関連はオブジェクト間の多重度を定義します。例えば、TeacherオブジェクトとStudentオブジェクトがあります。教師と生徒の間には一対多の関係があります。同様に、学生は教師オブジェクトとの一対多の関係を持つことができます。ただし、学生オブジェクトと教師オブジェクトはお互いに独立しています。

9. 集約

集約は特別な関連の一種です。集約ではオブジェクトは独自のライフサイクルを持ちますが、所有権があります。オブジェクト間に「HAS-A」の関係と所有権がある場合、それは集約のケースです。

6. 構成

構成は集約の特殊なケースです。構成は集約のより制限された形式です。 “HAS-A”関係にある含まれるオブジェクトが独立して存在できない場合、それは構成の場合です。例えば、House has-a Roomです。ここで部屋は家なしでは存在できません。構成は継承よりも優れていると言われています。詳細はComposition vs Inheritanceを参照してください。

さらに読む: Javaにおける構成

これで、OOPSコンセプトの簡単なまとめです。

より多くのJavaの例プログラムは、当社のGitHubリポジトリからご覧いただけます。

参考文献:https://docs.oracle.com/javase/tutorial/java/concepts/

Source:
https://www.digitalocean.com/community/tutorials/oops-concepts-java-example