infatuation

Generic 본문

Programming/Java/C/C++

Generic

화령 2010. 10. 26. 12:56

 <출처 : "Java의 정석" 도우출판 >

 JDK1.5가 발표되면서 언어 자체의 기본 문법적인 부분에서 몇가지 기능이 추가됐다. 
Generics는 Collection Framework와 관련된 기능으로 Collection에 저장하는 객체의 타입을 컴파일시에 체크하기 때문에 객체의 타입 안정성을 높이고 꺼낼 때는 자동으로 형변환해주기 때문에 편리하다.
 
참고) 타입안정성을 높인다는 것은 의도하지 않은 타입의 객체를 저장하는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 형변환되어 발생할 수 있는 오류를 막아준다는 뜻 

Collection에 저장할 객체의 타입을 지정하기 위해 아래와 같이 한다.
 
- Collection에 저장할 수 있는 객체는 지정한 타입의 객체뿐이다.

Collection Class<저장할 객체의 타입> = new CollectionClass<저장할 객체의 타입>; 


아래의 코드는 ArrayList에 Tank객체만 저장할 수 있도록 작성한 것. 
Tank 객체 이외의 객체를 저장하려고 하면 컴파일 시에 에러가 발생한다. 

// Tank 클래스의 객체만을 저장할 수 있는 ArrayList를 생성
 ArrayList<tank> list = new ArrayList<tank>();
list.add(new Tank());
list.add(new Dropship()); // 컴파일 에러 발생 !!!

저장된 객체를 꺼낼 때는 형변환 하지 않아도 자동형변환 된다. 아래는 Generics를 적용한 코드와 그렇지 않은 코드를 비교한 것이다.
* 일반코드 
ArrayList list = new ArrayList();  
list.add(new Tank());     
Tank k = (Tank) list.get(0);    
* Generics 적용한 코드 
ArrayList<tank> list = new ArrayList<tank>();
 list.add(new Tank());
  Tank k = list.get(0);
 
만일 다형성을 사용해야 하는 경우 상위 클래스의 타입을 지정함으로써 여러 종류의 객체를 저장할 수 있다.
class Unit { }
class Tank extends Unit { }
class Dropship extends Unit { }

// Unit 클래스의 하위 클래스의 객체를 저장할 수 있는 ArrayList 생성
ArrayList<unit> list = new ArrayList<unit>();
list.add(new Tank());
list.add(new Dropship());

Unit u = list.get(0);              // 형변환 필요없음
Tank k = (Tank) list.get(0);  // 형변환이 필요함

Generics 활용 예제 코드
public class Sample<t> {
        private T data;
 
        public Sample(T forData) {
                data = forData;
        }
 
        public T getData() {
                return data;
        }
 
        //generic method inside of generic class
        public void showTo(ViewerType viewer) {
                System.out.println("Hello " + viewer);
                System.out.println("Data is " + data);
        }
 
        public static void main(String[] args) {
                // 객체 생성시 Genetic 타입으로 생성
                Sample object = new Sample(42);
                // object.getData() 의 타입은 String임을 명시
                object.showTo(object.getData());
        }               
}

'Programming > Java/C/C++' 카테고리의 다른 글

C Language Keyword  (1) 2011.04.10
Collection Framework(Collection_Map)  (0) 2011.04.09
Java Callback Function  (0) 2010.10.26
JVM Terminated Exit code = -1  (0) 2010.05.15