728x90
제한된 타입 파라미터(<T extends 최상위타입>)
타입 파라미터에 지정되는 구체적인 타입을 제한할 필요가 종종있다.
예를 들어 숫자를 연산하는 제네릭 메소드는 매개값으로 Number 타입 또는 하위 클래스 타입(Byte, Short, Integer, Long, Double)의 인스턴스만 가져야 한다. 이때 사용할 수 있는것이 제한된 타입 파라미터이다.
제한된 타입 파라미터를 선언하려면 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 된다.
상위 타입은 클래스 뿐만 아니라 인터페이스도 가능하다.
사용 방법
public <T extends 상위타입> 리턴타입 메소드(매개변수,...) {...}
타입 파라미터에 지정되는 구체적인 타입은 상위 타입이거나 상위 타입의 하위 또는 구현 클래스만 가능하다.
메소드의 중괄호 {} 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤머(필드, 메소드)로 제한된다.
사용 예시
public <T extends Number> int compare(T t1, T t2) { // 숫자타입만 구체적으로 갖을수 잇다.
double v1 = t1.doubleValue(); // Number의 doubleValue() 메소드 사용
double v2 = t2.doubleValue(); // Number의 doubleValue() 메소드 사용
return Double.compare(v1, v2)
}// Double.compare()메소드는 첫번째 매개가작으면 -1을, 같으면 0, 크면 1을 리턴한다.
이렇게 선언하면 Number타입 또는 하위 클래스 타입(Byte, Short, Integer, Long, Double)의 인스턴스만 가져야 한다.
와일드카드 타입(<?>, <? extends ...>, <?super ...>)
코드에서 ?를 일반적으로 와일드카드(wildcard)라고 부른다.
제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 구체적인 타입 대신에 와일드카드를 다음과 같이 세 가지 형태로 사용할 수 있다.
- 제네릭타입<?> : Unbounded Wildcards(제한 없음) 타입 파라미터를 대치하는 구체적인 타입으로 모든 클래스나 인터페이스 타입이 올 수 있다.
- 제네릭타입<? extends 상위타입> : Upper Bounded Wildcards(상위 클래스 제한) 타입 파라미터를 대치하는 구체적인 타입으로 하위타입만 올 수 있다.
- 제네릭타입<? super 하위타입> : Lower Bounded Wildcards(하위 클래스 제한) 타입 파라미터를 대치하는 구체적인 타입으로 상위 타입만 올 수 있다.
사용 예제 - Course 클래스
타입 파라미터 T가 적용된 곳은 수강생 타입 부분
// 제네릭 타입
public class Course<T> {
private String name;
private T[] students;
public Course(String name, int capacity) {
this.name = name;
students = (T[]) (new Object[capacity]);
}
public String getName() { return name; }
public T[] getStudents() {return students; }
public void add(T t) {
for (int i = 0; i < students.length; i++) {
if (students[i] == null) {
students[i] = t;
break;
}
}
}
}
수강생이 될 수 있는 타입을 다음 네가지 클래스라고 가정한다. Person의 하위 클래스로 Worker와 Student가 있고, Student의 하위 클래스로 HighStudent가 있다.
- Course<?> : 수강생은 모든 타입(Person, Worker, Student, HighStudent)이 될 수 있다.
- Course<? extends Student> : 수강생은 Student, HighStudent만 될 수 있다.
- Course<? super Worker> : 수강생은 Worker와 Person만 될 수 있다.
'Languages > Java' 카테고리의 다른 글
[Java] 람다식 (1) 람다식 개념과 기본 문법 (0) | 2021.12.30 |
---|---|
[Java] 제네릭 (4) 제네릭 타입의 상속과 구현 (0) | 2021.12.28 |
[Java] 제네릭 (2) 멀티 타입 파라미터, 제네릭 메소드 (0) | 2021.12.28 |
[Java] 제네릭 (1) 개념, 제네릭 타입(class<T>, interface<T>) (0) | 2021.12.28 |
[Java] 컬렉션 프레임워크 (Collection Framework) (4) 검색 기능 강화 컬렉션 - TreeSet, TreeMap (0) | 2021.12.27 |
댓글