일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 신경망
- 구글 앱 엔진
- Python
- NarwalFreo
- Bidirectional Associative Memory
- 삼성전자 소프트웨어멤버십 SSM
- 삼성
- BAM
- 빅데이터
- 파이썬
- Google App Engine
- 물걸레로봇청소기추천
- 물걸레자동세척로봇청소기
- 가상화
- 고려대학교
- 동아리
- 나르왈프레오
- 하이퍼바이저
- Neural Network
- 패턴인식
- 인공지능
- Friendship
- 신경회로망
- hopfield network
- 멤버십
- 증강현실
- 삼성소프트웨어멤버십
- 패턴 인식
- 갤럭시탭S8울트라
- SSM
- Today
- Total
정보공간_1
[5기 부산 정우진] 자바 제네릭 이야기 본문
자바의 제네릭은 Gilad Bracha, Martin Odersky, David Stoutamire, Philip Wadler에 의해 Generic Java의 머릿글자를 딴 GJ라는 프로젝트에서 시작 하였는데 이후 jdk 1.5버전에 정식으로 추가 되었습니다.
GJ는 피자(Pizza)라는 프로젝트에서 기반을 두고 있는데 피자는 Martin Odersky와 Philip Wadler가 1996년에 발표한 JVM에서 돌아가는 언어였습니다. 이 무렵 자바라는 신생 언어에 흥미를 느꼈던 이들은 정식 출시 되지 않았던 자바 코드를 대상으로 함수형 프로그래밍 요소를 집어넣은 실험용 프로젝트를 수행 했었는데 이렇게 태어난 언어가 피자 였고 이안에 제네릭이 포함되어 있었습니다.
<Team GJ Left to right: Philip Wadler, Martin Odersky, Gilad Bracha, David Stoutamire>
이후 자바가 정식으로 출시 되었던 1995년으로 1년 뒤인 1996년에 피자를 발표하여 관심을 끌었고 당시 Sun Microsystems에서 자바의 핵심 팀원으로 있었던 Gilad Bracha와 David Stoutamire가 피자의 제네릭과 관련된 부분에 감명을 받고 Odersky와 Wadler에게 관심을 표했습니다. 이후 이들은 팀을 꾸려 GJ 개발에 착수하였고 1998년도에 GJ를 발표 하고 6년뒤 jdk 1.5의 핵심기능으로 등장 하였습니다.
이러한 자바의 제네릭은 많은 사람들로 부터 비판을 받고 있는 요소가 있는데 일명 지우개(eraser)라불리는 기능 입니다. 자바 제네릭에서 지우개 기능은 컴파일 과정에서 ‘제네릭’ 혹은 ‘타입’에 관한 정보를 지워 버린다는 것인데 이것은 자바의 제네릭 기능이 우리가 코딩을 하는 소스코드에서만 지원을 하며 바이트코드 상에서는 이러한 기억을 지워 버린다는 것입니다.
소스코드에는 List<Integer>와List<Float>은 서로 다른 타입으로 인식하지만 바이트코트에는 그냥 같은 List에 지나지 않습니다. 따라서 자바의 제네릭은 일종에 컴파일러 트릭에 불과한 것입니다. 하지만 C#의 경우는 바이트 코드에 해당하는 IL(Intermediate Language)코드가 타입과 관련된 정보를 기억하고 있기 때문에 List<Integer>와 List<Float>은 서로 다른 IL코드를 생성하게 됩니다. 이러한 코드가 CLR(Common Language Runtime)위에서 실행될 때 IL코드를 바이너리로 컴파일 하는데 이러한 바이너리 역시 타입을 기억하고 있습니다.
간단한 예를 통해 자바 제네릭의 지우개 기능을 좀더 알아 보도록 하겠습니다.
// C# Code public void Add<E>(E member) { if(member.GetType() == typeof(List<Software>)) Console.Out.WriteLine(“Software Membership”); else if(member.GetType() == typeof(List<UX>)) Console.Out.WriteLine(“UX Membership”); }
// Java Code public <E> void add(E member) { if(member instanceof List<Software>) System.out.println(“Software Membersip”); else if(member instanceof List<UX>) System.out.println(“UX Membership”); }
두가지 언어로 작성된 위의 코드는 List 타입에 따라 메세지를 출력하는 코드이다. 하지만 자바의 코드를 컴파일 하려고 하면 에러를 출력하는데 파라미터화된 타입에 대해서는 instanceof 검사를 수행할 수 없다는 메세지가 출력됩니다.
이것이 바로 자바 제네릭의 지우개 기능인데 컴파일러가 List<Software> 대신 List<?>를 사용하라고 안내해 줌니다. ? 키워드는 <? extends Object>의 축약형으로 자바의 모든 클래스는 Object를 상속하고 있기 때문에 타입을 고려할 필요가 없다는 의미가 되며 결국 제네릭을 사용할 이유가 없는것과 같은 점 입니다.
자바의 이러한 제네릭의 제한적인 기능은 기존에 존재하는 JVM의 호환성을 무시 할 수 없었기 때문으로 보입니다. 바이트코드와 바이너리 상태에서 제네릭과 관련된 타입의 정보를 기억하게 하려면 JVM자체를 수정해야 했기 때문에 이미 널리 쓰이고 있는 JVM을 고친다는 것은 자바의 호환성을 크게 깨뜨리는 결과를 가져 오기때문에 자바 제네릭의 지우개 기능은 어쩔수 없었던 선택 이였던 것으로 보입니다.
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[5기 강남 김영현] PE File Format #1 (0) | 2014.05.09 |
---|---|
[5기 강북 강현호] HTML5 게임 프레임워크 LimeJS Introduction (0) | 2014.05.02 |
[5기 부산 정우진] 람다표현식(Lambda Expressions)과 클로저(Closure) (0) | 2014.04.24 |
[4기 신촌 박영웅] App? Accessory? Appcessory! (2) | 2014.01.14 |
[4기 신촌 김시재] OpenGL에서 텍스처를 빠르게 갱신하는 방법 (0) | 2013.12.06 |