Java의 Generic은 C, C++의 템플릿과 같은 기능 입니다. 하나의 코드를 다양한 데이터 타입에 대해 사용할 수 있도록 하는 편리한 기능 입니다. 자바에서는 1.5 버전에서 부터 사용할 수 있습니다.
자바에서도 자신만의 Generic 코드를 작성할 수 있지만, 여기서는 자바를 사용하면서 Generic이 가장 많이 사용되는 컬렉션 객체에 대해 알아보고, 좀 특수한 형태인 Generic에서의 와일드 카드에 대해서도 알아봅니다.
Java SE 1.5 이전의 자바에서는 자료구조에 데이터를 저장할때 Object 타입으로 저장하였습니다. Object는 모든 객체의 최상위 객체이므로 모든 객체는 Object 타입으로 다룰 수 있습니다. 하지만 객체 자신만의 기능을 사용하기 위해서는 원래 객체로 캐스팅 되어야 합니다.
Generic이 지원되지 않으면 다음과 같이 사용해야 합니다.
ArrayList list = new ArrayList();
list.add(new Car());
Car car = (Car)list.get(0);
Generic이 지원되면 다음과 같이 사용할 수 있습니다.
ArrayList<Car> list = new ArrayList<Car>();
list.add(new Car());
Car car = list.get(0):
가장 큰 차이점은 Generic 이 지원되면 컬렉션 객체에 넣을 데이터 타입을 지정하고, 사용할때 캐스팅이 필요 없다는 것 입니다. 이렇게 하므로 인해 컴파일시에 오류가 체크되는 장점을 가지게 됩니다.
제네릭 코드에서 물음표(?)는 와일드카드로 불리며, 알 수 없는 타입을 나타냅니다. 와일드카드는 파라미터, 필드, 지역 변수의 타입 또는 때때로 반환 타입과 같은 다양한 상황에서 사용될 수 있습니다. 와일드 카드는 제네릭 메소드 호출에 대한 형식 인수, 제네릭 클래스 인스턴스 생성, 또는 슈퍼타입으로 사용될 수 없습니다.
1. Upper Bounded Wildcards
변수의 제한을 완화하기 위해 upper bounded wildcard를 사용할 수 있습니다. 예를 들어, List<Integer>, List<Double>, List<Number>를 인자로 받을 수 있는 메소드를 만들기 위해서 upper bounded wildcard를 사용할 수 있습니다.
public static void process(List<? extends Number> list) {
//
}
2. Unbounded Wildcards
unbounded wildcard 타입은 List<?> 와 같이 물음표 만으로 정의 되어 집니다(모든 타입을 인자로 받을 수 있습니다). 이 방법은 두 가지 유효한 사용법이 있습니다. 첫 번째는 Object 클래스에서 제공되는 기능만을 사용할 경우이고, 두 번째는 제네릭 클래스의 메소드들중에 List.size, List.clear처럼 타입 파라미터에 의존하지 않는 메소드들만을 사용할 경우입니다.
3. Lower Bounded Wildcards
lower bounded wildcard는 <? super A>와 같이 물음표와 super 키워드로 정의합니다. upper bounded wildcard와는 반대로 지정된 타입과 그 상위타입만을 허용합니다. 예로 List<? super Integer> 로 정의 하면 Integer의 상위인 Number와 Object 가 사용 가능합니다.
'프로그래밍 > 자바' 카테고리의 다른 글
Jsoup 예제 - 그누보드 크롤링 (0) | 2018.09.09 |
---|---|
자바(Java)로 파일의 마임 타입(MIME Type) 확인하기 (0) | 2018.08.21 |
Open JDK 9 와 이클립스 설치하기 (0) | 2018.06.30 |
Java에서 UUID 클래스를 사용하여 유일한 식별자 생성하기 (2) | 2018.05.24 |
Java에서 assert 사용하기 (3) | 2018.05.04 |