클래스
,인터페이스
,메소드
등에서 사용될 수 있는타입 매개변수(parameter)
ex.
ArrayList
는 제네릭 타입을 사용하여 요소의 타입
을 지정할 수 있다.
이 때 요소의 타입은 ArrayList의 인스턴스를 생성할 때 매개변수
를 통해 전달된다.
ArrayList<String> list = new ArrayList<String>();
import ...Movie;
import java.util.ArrayList;
import java.util.List;
public class ArrayListGeneric {
public static void main(String[] args) {
List<Movie> list = new ArrayList<Movie>();
list.add(new Movie("괴물", "봉준호", "2006", "한국"));
list.add(new Movie("기생충", "봉준호", "2019", "한국"));
// list.add("Hello"); // X
System.out.println(list.get(0));
System.out.println(list.get(1));
}
}
public class Movie {
private String title;
private String director;
private String year;
private String country;
// 이하 생략...
제네릭 타입
을 여러 개 선언하여 사용하는 것
import java.util.HashMap;
import java.util.Map;
public class PairGenericTest {
public static void main(String[] args) {
Pair<String, Integer> pair = new Pair<>("hello", 1);
System.out.println(pair.getKey()); // hello
System.out.println(pair.getValue()); // 1
// 검색을 빠르게 할 수 있는 자료구조(HashMap, Hashtable)
Map<String, Integer> maps = new HashMap<>();
maps.put("kor", 60);
maps.put("eng", 80);
maps.put("mat", 70);
System.out.println(maps.get("kor")); // 60
System.out.println(maps.get("eng")); // 80
System.out.println(maps.get("mat")); // 70
}
}
- 특정 타입으로 제한된 제네릭 타입 파라미터
- 제네릭 클래스나 메서드에서 사용할 수 있는 타입을 제한할 수 있다.
public class GenericLimitTest {
public static void main(String[] args) {
Integer[] integers = {1,2,3,4,5};
Double[] doubles = {1.0, 2.0, 3.0, 4.0, 5.0};
AverageCalculator<Integer> integerAverageCalculator = new AverageCalculator<>(integers);
double integerAverage = integerAverageCalculator.calculateAverage();
System.out.println(integerAverage);
AverageCalculator<Double> doubleAverageCalculator = new AverageCalculator<>(doubles);
double doubleAverage = integerAverageCalculator.calculateAverage();
System.out.println(integerAverage);
}
}
public class AverageCalculator<T extends Number> {
private T[] numbers;
public AverageCalculator(T[] numbers) {
this.numbers = numbers;
}
public double calculateAverage() {
double sum = 0.0;
for (T number : numbers) {
sum+=number.doubleValue();
}
return sum/numbers.length;
}
}