2021年06月31日講義


ジェニーリックの方法
各タイプとタイプのタイプパラメータを返す方法.
タイプを返す前に<>記号、タイプパラメータ技術を追加します.public void set(T t){ ;; }上記の方法は戻りタイプの前に<>がないのでJENERICメソッドとは呼べません.これはJENICクラスをパラメータとする例示的な方法である.public <T> void set (T t){ ;; }このようにタイプパラメータを記述してこそ、最終的な方法になります.
ジェニーリックタイプでもジェニーンリックの方法があるかもしれないし、ないかもしれない.
public class BoxingMethodEx {

	public static void main(String[] args) {
		//Util.boxing 메소드는 Generic method이기 때문에
		//이 메소드를 호출할 때(=사용할때) 는 타입파라미터에 **구체타입**을 지정해서 호출해야 함.
		Box<Integer> box1 = Util.<Integer>boxing(100);	// 구체타입으로 Integer 지정
		int intValue = box1.get();			// 따라서 box1의 값을 intValue로 받을 수 있음.
		
		//위 코드는 아래와 같음
//		Box box1 = Util.boxing(100);
//		int intValue = (int)box1.get();
		
		///////////////////////
		
		Box<String> box2 = Util.boxing("홍길동"); //<Integer>를 생략하면 타입추론 발생. 타입추론은 Lvalue가 아니라, Rvalue의 매개변수값을 보고 추론함
						 	 // >>하지만 제네릭메소드 사용법 익숙해질때까진 생략하지 말 것
		String strValue = box2.get();
		
	} //main
	
} //end class
Utility class (or Helper class)
通常、現実世界のオブジェクトをモデリングすることによって作成されるクラスではありません.
これは、さまざまな有用な機能を提供するためのクラスです.
  • 構成方法の多くは静的方法(static method)
  • と宣言する.
    したがって、フィールドはほとんどなく、作成者も宣言されません.
    public class Util {
    
    	//타입 파라미터 T를 가지고 있으므로 제네릭 메소드임.
    	public static<T> Box<T> boxing(T t){
    		Box<T> box = new Box<T>();
    		box.set(t);
    		return box;
    	} //boxing
    	
    } //end class
    
    制限されたタイプパラメータ
    制限タイプパラメータ<T>で指定できる特定のタイプ(Enumタイプと同じ!)
    extends関係制限タイプを使用できます.public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) { ;; }親タイプはクラスでもインタフェースでも構いません.
    ただし、implementsキーワードは使用されません.
    キーワードはextendsでなければなりません<T>の特定のタイプとして指定できるのは、上流タイプまたは延長上流タイプのタイプのみです.(サブタイプのフィールドのみ、メソッドは使用できません)
    親タイプをチェックするにはOpenType Hiercyを使用します.
    
    public class Util {
    
    	//타입파라미터 T에 지정가능한 구체타입의 범위를 제약 >> extends 키워드 사용
    	//<T extends 부모타입> : 지정가능한 구체타입은, 부모타입이거나 / 부모타입을 상속받는 자식타입만 가능
    	public static <T extends Number> int compare(T t1, T t2){
    		double v1 = t1.doubleValue();
    		//log.info(t1.getClass().getName());
    		
    		double v2 = t2.doubleValue();
    		
    		return Double.compare(v1, v2);
    	} //compare
    	
    } //end class
    
    public class CompareMethodEx {
    
    	public static void main(String[] args) {
    		//Generic Type Pair 객체를 2개 생성(사용) >> 이 때 구체타입 지정(K, V)
    		//Pair(K, V> : K ==> key 필드의 타입, V ==> value 필드의 타입
    		
    		//그런데 우리가 배웠다시피 구체타입 지정할때 Lvalue와 Rvalue
    		//양쪽에 두 번 지정할 필요 없음 >> Rvalue 구체타입은 생략!
    //		Pair<Integer, String> p1 = new Pair<Integer, String>(1, "사과");
    //		Pair<Integer, String> p2 = new Pair<Integer, String>(1, "사과");
    		Pair<Integer, String> p1 = new Pair<>(1, "사과");		//타입추론
    		Pair<Integer, String> p2 = new Pair<>(1, "사과");		//타입추론
    		
    		
    		//Generic Method호출(사용) >> 이 때 구체타입 지정
    		boolean result1 = Util.<Integer, String>compare(p1, p2);
    		if(result1) {
    			log.info("논리적으로 동등한 객체입니다.");
    		} else {
    			log.info("논리적으로 동등하지 않은 객체입니다.");
    		} //if-else
    		
    		
    		//////////////////////////////////////////
    		
    		Pair<String, String> p3 = new Pair<String, String>("user1", "홍길동");
    		Pair<String, String> p4 = new Pair<String, String>("user2", "홍길동");
    		
    		boolean result2 = Util./*<K,V>*/compare(p1, p2);	//타입추론
    			//구체타입을 생략할 때,
    			//제네릭 *객체 생성*시에는 <> 다이아몬드 남겨놓고, 제네릭 *메소드 사용*시에는 <> 다이아몬드 기호까지 같이 생략함.
    		
    		if(result1) {
    			log.info("논리적으로 동등한 객체입니다.");
    		} else {
    			log.info("논리적으로 동등하지 않은 객체입니다.");
    		} //if-else
    		
    	} //main
    	
    } //end class
    
    具体的なタイプを省略する場合、
    JENERICオブジェクトを生成するときに<>ダイヤモンド記号を残します.
    JENICメソッドを使用する場合は、<>ダイヤモンド記号も省略します.
    比較(value 1,value 2)方法
    ソートアルゴリズムを実装する際によく使用されます!
    既定のパッケージタイプで使用可能
    compare(value 1,value 2)メソッド
    2つの値を比較し、比較結果を次のように返します.
  • 値1>値2=>+戻り値(通常は+1)
  • 値1=value 2=>0は
  • を返します.
  • 値1<値2=>-負の値(通常は-1)
  • を返します.
    資料構造で再処理されます!