* Generics

 - 객체를 저장하는 기술인 Collection Framework의 단점을 개선한 기능.

 - 데이터 자료형인 String, Integer같은 형태를 처음에 정해 놓지 않고

    임의의 타입으로 명시해 준 후에 나중에 직접적으로 해당구문을 사용할때 지정하는 형태

 - Class ArrayList<E>에서 'E'가 있는 곳에는 ArrayList를 선언하고
   생성할 때 사용할 실제타입이 들어간다.

 - E는 Element(원소)를 말하며,
    new ArrayList<String>() 이면 'E'는 'String' 클래스를 가르키며,
    < > 안의 String은 유형 매개 변수(type parameter)이다.
   따라서 boolean add(Object o) 메소드는 boolean add(String o) 가 된다.

 - 'E'는 ArrayList의 인스턴스를 만들때 < > 안에 넣는 타입을 말함.

 - 'E'는 컬렉션에 저장하고 컬렉션에서 리턴할 원소의 타입을 가르킴.

 

   형식)

           class 클래스명 <제네릭타입>

           {

                   ~~~

            }

 

----------------------------------------------------GenericsEx1.java

class Test <T>{
     private T a;
     public Test(T a){
           this.a=a;
     }
     public T get(){
           return a;
     }
}

 

public class GenericsEx {
   public static void main(String[] args) {
         //제네릭클래스를 사용할때 객체생성시 <String>처럼
         //파라미터를 반드시 써야 함
         Test<String> ts=new Test<String>("제네릭 타입으로 String 선택");
         System.out.println(ts.get());

         Test<Integer> ti=new Test<Integer>(100);
         System.out.println(ti.get());

         Test<Double> td=new Test<Double>(3.14);
         System.out.println(td.get());
  
         //와일드카드 <?>는 모든 타입의 파라미터를 받아들일수 있다
         Test<?> tq1=ts; //<?>이 <String>타입 파라미터를 받아들임
         System.out.println(tq1.get());
  
         Test<?> tq2=ti;
         System.out.println(tq2.get());

         Test<?> tq3=td;
         System.out.println(tq3.get());
  
         //?는 Number의 하위 타입이므로 Integer타입 ti를 받아들일수 있다
         Test<? extends Number> ten=ti;
         System.out.println(ten.get());

         //?는 Number보다 상위타입이므로 Integer타입 ti를 받아들일수 없다
         //Test<? super Number> tsn=ti; 에
         //System.out.println(tsn.get());
     }

}

----------------------------------------------------GenericsEx2.java

class Test2{
    public <T> void get(T a){
        System.out.println(a);
    }
}
public class GeneEx {
     public static void main(String[] args) {

          Test2 t=new Test2();
           //제네릭 메소드는 타입 파라미터를 지정할 필요가 없다
           t.get("dd");
           t.get(100);
           t.get(3.14);
     }

}

----------------------------------------------------GenericsEx3.java

package oop9jcf;

import java.util.ArrayList;
import java.util.Iterator;

public class GenericsEx3 {
   
    //list인수는 Integer객체만 저장된 List 객체를 받을 수 있다.
    public void prn(ArrayList<Integer> list){
        Iterator i = list.iterator();
       
        for (int k=0; k < list.size(); k++){
            Integer su = (Integer)i.next();
            System.out.println("su=" + su);           
        }//exception 발생
    }
   
   
    public static void main(String[] args) {
      //1)Generics사용하지 않은 경우. exception발생
     /*
        ArrayList list = new ArrayList(10);    
        list.add(new Integer(10));  //Integer 추가
        list.add(new Integer(50));  //Integer 추가
        list.add("List Test");      //String 추가
        list.add(new Float(100.0)); //Long 추가
       
        for(int i=0; i<list.size(); i++){         
            Integer iobj = (Integer)list.get(i);
            int tot = iobj.intValue() + 1000;
            System.out.println("tot= " + tot);
        }
     */
       
        //2)generics가 적용된 코드 (compile 시점에 에러가 체크됨 )
        ArrayList<Integer> list = new ArrayList<Integer>(10);
        list.add(new Integer(10));
        list.add(new Integer(20));
       
        // ERROR 강제 발생 부분, Integer 타입만 가능,코딩할때 발견.
        // Generics는 ArrayList에 지정된 타입만 저장되게 하는 기능을 제공       
        //list.add("HAPPY");
        //list.add(new Long(10));
       
        //3)메소드에서 Generics 사용
        ArrayList al=new ArrayList();
        al.add(new Integer(123));
        al.add("HAPPY");
       
        GenericsEx3 gg=new GenericsEx3();
        gg.prn(al);
    }
}

----------------------------------------------------GenericsEx4.java

package oop9jcf;

import java.util.ArrayList;
import java.util.Iterator;

class Mountain
{
    public String name; //산이름
    public int height;  //산높이
    public Mountain() {}
    public Mountain(String name, int height) {
        this.name = name;
        this.height = height;
    }   
}
//===================
public class GenericsEx4 {
    public static void main(String[] args) {
        Mountain mt1=new Mountain("관악산", 1000);
        Mountain mt2=new Mountain("수리산", 2000);
        Mountain mt3=new Mountain("금강산", 3000);
       
        ArrayList<Mountain> list=new ArrayList<Mountain>();
        list.add(mt1);
        list.add(mt2);
        list.add(mt3);
       
        for(int idx=0; idx<list.size(); idx++){
            //Grnerics 사용시 형변환 불필요
            Mountain m=list.get(idx);
            System.out.println(m.name+" "+m.height);
        }
       
        Iterator<Mountain> iter=list.iterator();
        while(iter.hasNext()){
           Mountain m=(Mountain)iter.next(); // 형변환 필요         
           System.out.println(m.name+" "+m.height);
        }
    }
}

 

 



 

'..열심히 공부하세.. > JAVA 문법' 카테고리의 다른 글

[Vector 예제] Buyer - 반품 refund() 메소드  (0) 2012.06.26
[35] JDBC  (0) 2012.05.15
[33] Java Collections Framework  (0) 2012.05.08
[32] Object 클래스  (0) 2012.05.04
[31] Exception 예외처리  (0) 2012.05.04

+ Recent posts