개발 이야기/Java

Generic 사용하기..*^^*

시반 2008. 1. 23. 17:26

JDK 1.5부터 Gerneric라는 개념이 추가되었습니다.

 

이전에는 Collection 객체에 데이터를 넣고 뺄때 Object 타입을 사용했었죠..

즉 Collection 객체에 넣었을 때의 타입으로 캐스팅을 해서 사용합니다.

 

ArrayList list = new ArrayList();

list.add("test");

String value = (String)list.get(0);   // 꺼낼때 캐스팅 해야함.

 

하지만 Generic이라는 개념이 도입되면서 조금 바뀌게 되었네요.

type을 명확하게 정하지 않고도 type을 처리할 수 있는 C++의 템플릿과 비슷한 기능으로 사용법은 비슷합니만

다른 점은 <> 사이에 들어가는 type의 수만큼 class를 만드는 C++과는 달리 java에서는

하나의 class로 여러 type들을 처리합니다

 

실제로 collection 객체를 사용할때 하나의 객체에 서로 다른 타입을 넣어서 사용할 때는 잘 없습니다.

주로 한가지 타입의 객체만을 넣어서 사용합니다.

이때 실수로 다른것 넣을 수도 있습니다. 이런 부분은 컴파일 시에는 잡히지고 않고 실행시에만 발견 됩니다.

 

하지만 Generic 을 사용함으로써 컴파일시에 오류를 잡을 수 있으므로 더욱 견고한 코드를 만들 수 있겠져

이렇게 Generic를 사용하는 첫번째 이유는 생성시 사용할 타입을 지정할 수 있으므로 다른 타입의

객체를 실수로 사용하는것을 컴파일타임에 방지할 수 있다는 점에 있습니다

 

 ArrayList<String> list = new ArrayList<String>();
 list.add("1");
 list.add("2");
 String value = list.get(0);            

 

 

위의 예에서  list엔 String만이 들어갈것을 선언하였기에 값을 집어넣을때도 String형만을 넣을수 있습니다.

반대로 꺼낼때는 String형으로 반환됩니다.

즉  반환타입이 지정되어 있기 때문에 이전과는 달리 꺼낼때 캐스팅이 필요 없다는 겁니다.

 

 

이렇게 Collection에서 객체를 꺼낼때 캐스팅 없이 꺼낼수 있다는 점이 Generic을 사용하는 또하나의 장점이 될 수 있겠죠.

 

Generic을 쓰는 또하나의 이유는 Auto Boxing과 Auto UnBoxing일겁니다

자바는 객체지향언어이지만 기본타입들은 객체가 아닙니다. 그래서 이들에 대한 Wrapper클래스들을 자바에서는 제공하고 있습니다.

 

int num1 = 1;


Integer num2 = new Integer("2");

int num = num1+num2.intValue();

 

 

기존의 경우 기본타입을 객체로 사용하기 위해서 wrapper class에 담고 이후에


다시 기본형값을 사용하고자 할때는 wrapper Class에서 그 값을 반환하는 작업이 필요했지만

5.0 이후부터는 이러한 부분이 자동으로 이루어진다는 점(조아조아)

 


int num1 = 1;


Integer num2 = 2;      //auto Boxing

int num = num1+num2; //auto UnBoxing

 


Generic과 관련해보면


  
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("1", new Integer(1));
map.put("2", 2);            // auto boxing
 
Integer i = map.get("1");   // 따로 캐스팅이 필요 없다.
int j = map.get("2");       // auto unboxing


이렇게 별도의 캐스팅 없이 처리할 수 있다는 점에서 좋아졌네요..