JDK5에 등장한 Generic은 type parameter라는 개념을 도입하면서 자바 프로그래밍을 손쉽게 해줄 수 있는 멋진 언어기능으로 주목받아왔다. Generic을 이용해서 프로그래밍을 해보면 얼마나 편리하게 베이스클래스등을 만들 수 있는지 감탄하게 된다. 하지만 Generic을 좀 더 깊이 살펴보면 그다지 만만한 기술이 아닌 것을 알 수 있다. 자바 언어를 복잡하게 만든 대표적인 기술이라는게 Generic의 비판자들의 공통적인 주장이다. wildcard나 extend의 사용과 generic superclass, generic iterface등을 결합해서 쓸 때 주의 하지 않으면 매우 난해한 코드구조를 만들어 낼 수 있다.

OSAF개발을 할 때 Generic을 적용해서 제일 해피했던 것은 Spring의 HibernateDaoSupport를 Generic을 이용해서 generic DAO구조로 만든 것과 SpringMVC의 컨트롤러에 generic을 적용해 command object등의 불필요한 casting을 사용하지 않도록 만든 것이다.

하지만 문제는 Generic Enumeration을 만들때이다. singleton을 쓸까하다가 편하게 static을 쓰기로 했다. 문제는 static field, method에는 generic을 사용할 수 없다는 사실! 물론 generic method는 static에서 사용가능하지만 generic class의 type parameter를 static method에 적용하는 것은 불가능하다. 이유를 찾아보니 Java generic은 C++의 template과는 달리 컴파일시에 적용되는 것이 아니고 dynamic하게 인스턴스가 만들어질 때 적용된다는 것이다. 잘 이해가 안됐지만 그런가하고 포기하고 넘어갔다.

그러다가 최근에 Generic의 파라메터 정보를 읽어오면 편리하겠다 싶어서 reflection을 이용해서 파라메터 타입을 가져오려고 시도를 해봤으나 불가능했다. 왜 그럴까 생각을 해보다가 좀 더 Generic을 공부해 볼 필요를 느꼈다.

List<String> a;

이런 경우 프로그램 내에서 type parameter값이 무엇인지(String) 알아낼 방법이 없다는 것이다.

이유는 Erasure라는 것 때문이다. Java Generic은 JVM레벨의 호환성을 위해서 컴파일시에 Generic정보(<T>,<V>…)를 삭제해버린다. Generic정보가 없는 Raw Type(List)만 남는다는 것이다. -_-; 따라서 컴파일된 byte code내에는 저 <String>부분은 남아있지 않은 것이고 결국 reflection을 이용해서 그 것을 알아낼 방법이 없다. Generic은 단지 compile시에 타입체킹을 통해서 런타임시의 타입캐스팅을 보장해주는 방식으로 구현되어있다는 것이다.

이에 대해서 논쟁이 많이 있다.

참고해볼만한 것으로

오래됐지만 Generic과 Erasure에 대해서 잘 설명한 글.

Wikipedia의 설명도 읽어볼만 하다

자바의 Generic의 구현방법에 대한 비판 또한 적지 않다.

이러한 백그라운드에서 일어나는 자바의 Generic구현기능 덕분에 사실 여러가지 복잡한 문제가 발생할 수 있다. 그래서 Generic은 점점 더 복잡해진다.

한가지 흥미로운 것은 모든 Generic type정보가 삭제되지 않는다는 사실! Generic의 static한 정보는 컴파일 후에도 남고 이를 런타임시에 확인해서 사용할 방법이 있다. 다만 instance를 만들거나 변수선언에 사용한 정보는 삭제된다.
Rod Harrop은 이에 관해서 아주 좋은 글을 interface21팀 블로그에 올렸다.

한번 읽어서 완벽히 이해하고 적용하기가 쉬운 글은 아니지만 시간을 내서 꼼꼼히 분석해볼 가치가 있는 글이다.

Generic은 마스터하기가 쉬운 기술은 아니지만 적잘하게 사용했을 때 많은 장점이 있기 때문에 자바 개발자라면 반드시 도전해봐야 할 것이다.

Related posts:

  1. Generic DAO Pattern with JDK5.0
  2. Spring에 관한 흥미로운 글 몇가지
  3. Java In Action – New TSS Conference
  4. TheServerSide Java Symposium 2005에 가고 싶다
  5. JSR-330 Dependency Injection for Java 최종 승인
  6. Java Web Framework 비교(Struts, Spring, WebWork, Tapestry, JSF)
  7. 영어, 번역 그리고 발음
  8. 인터페이스 프로그래밍과 IDE 코드네비게이션편의성
  9. EasyMock 2.1 Released
  10. 유쾌한 이슈처리 재촉 메일
  11. S1A 2008 셋째날 – Spring JavaConfig
  12. Spring 3.0 (28) R-669 Update

Facebook comments:

to “Java Generic과 Erasure”

  1. Community Observations Fro get cialis

  2. Blanket Poop About viagra

  3. General Bumf About cheapest kamagra

  4. Normal Information More where to buy generic cialis

  5. Various Matter Forth cialis pharmacy

  6. Public Word About viagra for sale

  7. Blanket Information On every side viagra

  8. General Report More viagra

  9. General Advice Adjacent to sildenafil 50mg

  10. Widespread News Fro cialis price

  11. Blanket Poop Fro generic viagra online

  12. All-inclusive News Fro generic viagra online

  13. Ordinary Bumf About viagra

  14. Widespread Knowledge Fro generic cialis

  15. Comprehensive Dope Fro generic kamagra

  16. General Information About cialis online no prescription

  17. Overall Data More viagra

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha