* 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 |