[Java]Generic Programming(Generic Programming)


Generic class / Programming


  • プログラミング中に、複数のデータ型に使用できる変数がある場合は、これらの変数に基づいてクラスを作成する必要があります.この場合、似たようなコードをデータ型に従って複数のクラスを作成すると、オーバーヘッドが発生します.

  • この場合、複数のデータ型を含むようにGeneric classを使用してプログラミングする必要があります.

  • Generic classは宣言メソッドを使用して、後でクラスを使用するときにデータ型を指定します.

  • これらのGeneric classを使用して、さまざまなデータ型に適したclassまたはmethodを作成することを汎用プログラミングと呼びます.

  • Generic classはJava 5.0から提供されます.

  • Collection Frameworkで多く使われています.
  • すなわち、データ型に固有でない場合に使用する場合、必要なデータ型を宣言できる変数をgeneric classと呼び、この変数を用いたプログラミングをGeneric Programmingと呼ぶ.

    Generic classの使い方

  • Genericクラスの作成
  • Generic classを使用する場合は、次のコードに示すように、クラス名の横にを入力する必要があります.
  • 	public class GenericPrinter<T>
  • Generic変数の作成
  • Tは、クラスの使用時に実際に使用されるデータ型として指定されるデータ型パラメータである.
  • 静的変数は使用できません
  • 	private T material;
  • Generic method
  • は、1つまたは複数のデータ型パラメータを入力して返す方法である.
  • 汎用クラス
  • でなくても、汎用メソッドの使用を実現することができる.
  • 共通<データ型パラメータ>戻りメソッド名(データ型パラメータ...){ }
  • の下のコードに示すように、メソッドに戻り値があれば、資料型位置にTを記入し、パラメータを受信する必要がある場合は、その位置にTを記入する.
  • 	public T getMaterial() {
    		return material;
    	}
    
    	public void setMaterial(T material) {
    		this.material = material;
    	}
  • として定義されたGenric classの作成
  • <>で使う資料型を入力すればいいです.
  • <>を省略すると、インスタンスはオブジェクトとして生成されます.
  • 	GenericPrinter<Powder> powderPrinter = new GenericPrinter<>();
    

    Generic classの無効化


    👨🏻‍💻 Example Code


    Powder.java
    package ch06;
    
    public class Powder {
    	public String toString() {
    		return  "재료는 powder입니다. ";
    	}
    }
    ThreeDPrinter1.java
    package ch06;
    
    public class ThreeDPrinter1 {
    	private Powder material;
    
    	public Powder getMaterial() {
    		return material;
    	}
    
    	public void setMaterial(Powder material) {
    		this.material = material;
    	}
    	
    	public String toString() {
    		return "재료는 Powderrf 입니다.";
    	}
    }
    上記のPowderclassと同様の他のオブジェクトを作成する場合は、TheeDPrinterコードもclassの作成に伴って個別に作成する必要があります.あるいは、以下のコードに示すように、Objectを用いて符号化してもよい.ただし、Objectの場合、インスタンスの作成と使用中に形状を変換する手間がかかります.
    ThreeDPrinter3.java
    package ch06;
    
    public class ThreeDPrinter3 {
    	private Object material;
    
    	public Object getMaterial() {
    		return material;
    	}
    
    	public void setMaterial(Object material) {
    		this.material = material;
    	}
    	
    	public String toString() {
    		return "재료는 Powderrf 입니다.";
    	}
    }
    
    ThreeDPrinterTest.java
    package ch06;
    
    public class ThreeDPrinterTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		Powder powder = new Powder();
    		ThreeDPrinter3 printer = new ThreeDPrinter3();
    		
    		printer.setMaterial(powder);
    		Powder p = (Powder)printer.getMaterial();
    		// ThreeDPrinter3의 경우는 Object type을 이용하여 material을 만들었는데
    		// 이럴 경우 형 변환을 해줘야해서 번거로움이 발생한다.
    		// 그래서 generic programming이 생겨났다.
    		
    	}
    }

    Generic classのコードの使用


    👨🏻‍💻 Example Code


    GenericPrinter.java
    package ch06;
    
    public class GenericPrinter<T> {
    	// T는 자료형 매개변수로 이 클래스를 사용하는 시점에 실제 사용할 자료형을 지정하며 static 변수는 사용할 수 없다
    	
    	private T material;
    	// 나중에 사용할 때 사용할 자료형을 입력하면 해당 자료형으로 생성된다.
    
    	public T getMaterial() {
    		return material;
    	}
    
    	public void setMaterial(T material) {
    		this.material = material;
    	}
    	
    	public String toString() {
    		return material.toString();
    	}
    }
    
    GenericPrinterTest.java
    package ch06;
    
    public class ThreeDPrinterTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		Powder powder = new Powder();
    		ThreeDPrinter3 printer = new ThreeDPrinter3();
    		
    		printer.setMaterial(powder);
    		Powder p = (Powder)printer.getMaterial();
    		// ThreeDPrinter3의 경우는 Object type을 이용하여 material을 만들었는데
    		// 이럴 경우 형 변환을 해줘야해서 번거로움이 발생한다.
    		// 그래서 generic programming이 생겨났다.
    		
    	}
    
    }
    ※その他のコードは上記と重複省略

    Tデータ型の範囲制限


  • はT資料型の範囲を制限することができる.

  • 親クラスをGeneric classに継承する場合、Tは継承クラス(データ型)しか生成できません.

  • 継承を受け入れない場合、TはObjectに変換され、Objectクラスに組み込まれたメソッドのみが使用されます.

  • extendsを使用すると、使用可能なクラスを制限し、一般的なメソッドを指定できます.
  • 👨🏻‍💻 Example Code


    Material.java
    package ch07;
    
    //Generic class의 제한을 걸기 위한 class로 
    //해당 class는 직접 쓸 일이 없기에 abstract로 생성하였다.
    public abstract class Material {
    	public abstract void doPrinting();
    }
    Plastic
    package ch07;
    
    public class Plastic extends Material {
    	public String toString() {
    		return  "재료는 plastic 입니다. ";
    	}
    
    	@Override
    	public void doPrinting() {
    		// TODO Auto-generated method stub
    		
    	}	
    }
    GenericPrinter
    package ch07;
    
    public class GenericPrinter<T extends Material> {
    	// extends Material을 하여 T에 대한 제한을 하였다.
    	// Material을 상속받은 Class(자료형)으로만 생성 가능하다!!
    	
    	private T material;
    	// 나중에 사용할 때 사용할 자료형을 입력하면 해당 자료형으로 생성된다.
    
    	public T getMaterial() {
    		return material;
    	}
    
    	public void setMaterial(T material) {
    		this.material = material;
    	}
    	
    	public String toString() {
    		return material.toString();
    	}
    }
    
    ※その他のコードは上記と重複省略

    Reference

  • 「Fast Campas」を一度に完了したJava/spring Web開発主ハイパーパケットオンライン.