본문 바로가기
프로그래밍/자바

Java Generic사용법과 Generic에서의 와일드카드

by pentode 2018. 8. 12.

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 가 사용 가능합니다.


반응형