본문 바로가기

WEB_Programming/Pure Java

Generics > Introduction


JDK 5.0 은 몇가지 새로운 확장 기능을 제공한다. 이것중에 하나가 generics이다.

이 트레일은 generics에 대해서 소개한다. 다른 언어에서와 같이 유사한 생성자를 가지고 있으며, 대부분 C++ 템플릿과 같은 형식을 가진다. 그러므로 generics에서는 유사한점과 중요한 차이점 둘다 확인해 볼 수 있다. 만약 다른 것과 유사한점을 모른다면 더 낳을 수 있다. 이전 내용을 통해서 오해없이 새롭게 시작할 수있다. 

Generics는 추상 타입을 허용하도록 해준다. 가장 공통적인 예제는 컨테이너 타입이다. 이것은 컬렉션의 계층 구조와 같이 보면 된다.

여기네는 사용방법을 순서대로 기술해 두었다.

List myIntList = new LinkedList(); // 1

myIntList.add(new Integer(0)); // 2

Integer x = (Integer) myIntList.iterator().next(); // 3
3번째 라인은 조금 성가신 작업이다. 보통 프로그래머는 무슨 종류의 데이터가 리스트에 저장되어 있는지 알고 잇어야 한다. 그러므로 캐스트는 필수적인 작업이다. 컴파일러는 오직 Object를 반환하는것을 보장해줄 뿐이다. Integer 타입의 값을 배정하고, 그값이 명확하다고 가정을 해도 태스트는 필요하게 되어 있다.

물론 캐스트의 문제점만을 다루는 것이 아니다. 실행시간에 오류가 날 수 있다. 프로그래머의 실수로 인해 말이다.

만약 개발자가 충분한 의도를 가지고 있다면 리스트에 포함되는 데이터에 대해서 데이터 타입으로 어떻게 제한을 할 수 있을까? 이것은 generics의 숨은 핵심 아이디어이다. 다음은 주어진 제너릭을 이용한 버젼이 있다.

List<Integer> myIntList = new LinkedList<Integer>(); // 1'

myIntList.add(new Integer(0)); // 2'

Integer x = myIntList.iterator().next(); // 3'
myIntList와 같이 선언하는것을 확인해보자. 이것은 단순히 변경가능한 리스트를 지정하는 것이 아니다. 이것은 Integer의 리스트를 의미하는 것이다. List<Integer>로 쓰면 된다. 우리는 List는 generic 인터페이스에서 type parameter를 받아들인다. 이번 케이스에서는 Integer을 받아들이고 있다. 역시 리스트 객체를 생성할때 지정된 타입을 지정하고 있다.

3번재 라인에서는 캐스트 작업이 무시된다.

이제 우리는 혼란함을 벗어나게 되었다. Integer로 캐스트하는 대신에 우리는 첫번째 라인에서 Integer으로 타입을 명시했다. 그러나 여기에는 큰 차이가 있다. 컴파일러는 컴파일 시간에 이러한 체크 작업을 수행한다. 우리가 myIntList라고 이야기 한다면 이것은 myIntList 변수는 우리에게 컴파일 타임에 이러한 타입을 가질수있도록 지정했음을 보장하는 것이다. 대조적으로 캐스트는 코드 한 지점에서 프로그래머에게 해당 타입이 옳은것인지 알려줄 뿐이다.

이러한 프로그램 방식은 가독성을 증가 시키고, 더욱 견고하게 만들어 주는 역할을 수행한다.