제네틱 타입 파라미터의 제한하기
제한된 타입 매개변수(Bounded Type Parameter)
제네릭에 타입을 지정함으로써, 컴파일 타임에 오류를 발견할 수 있어 안정성이 확보되지만
어떤 타입도 사용할 수 있기 때문에 자유로움
이 때문에, 클리스의 제네릭 타입 파라미터로 원하는 타입만 들어올 수 있도록 제한하는 방법을 만들었는데, 이것이 제한된 타입 매개변수(Bounded Type Parameter)
타입 파라미터의 범위를 한정하는 키워드
- 타입 파라미터의 상한을 제한 : extends
- 타입 파라미터의 하한을 제한 : super
타입 파라미터의 상한을 제한하기(extends)
사용 문법
<T extends [제한타입]>
- 어떤 타입이라도 들어올 수 있는 일반적인 제네릭 타입인 T에
- extends 키워드를 사용하여, 타입 파라미터의 범위를 제한함
- extends를 사용하면 사용할 수 있는 타입의 상한을 정해놓는 것
- 따라서, 제한한 타입은 물론이고, 그 하위의 타입까지만 사용할 수 있음
예제
1. 클래스 타입을 한정
- 클래스의 인스턴스 생성 시에, 클래스에서 사용하는 데이터의 범위를 정할 수 있는데
- 이 때 원하는 참조타입을 가장 최상한인 Number클래스로 정함
- 사용할 수 있는 타입에는 가장 최상한인 Number클래스, 그 하위타입인(Integer, Double)까지 사용할 수 있음
2. 인터페이스 타입을 한정
- extends 키워드 다음에 올 수 있는 타입에는 일반 클래스, 추상 클래스, 인터페이스 모두 가능
- 인터페이스를 제한하는 경우에는, 인터페이스를 구현한 클래스만 제네릭 가능
// 인터페이스
interface Eating {
public void eatingIt();
}
// 인터페이스를 구현하는 클래스
class Animal implements Eating {
@Override
public void eatingIt() {
System.out.println("사료 먹기");
}
}
// T의 범위 제한: 인터페이스(Eating) 구현한 클래스(Animal)만 제네릭 가능
class AnimalHome <T extends Eating> { // 사용될 데이터 타입이 Animal 객체로 제한
Animal animal;
public AnimalHome() {
animal = new Animal();
}
}
public class Test {
public static void main(String[] args) {
// 타입 파라미터에 인터페이스를 구현한 클래스만 올 수 있음
AnimalHome<Animal> a = new AnimalHome<>();
}
}
3. 메서드의 타입 제한
public <T extends Number> void getAge(T num) {
}
- 특정 메서드 내에서 선언부에 제네릭 타입을 사용하면, 해당 메서드의 매개변수 타입이 제한됨
- extends 사용
- 매개변수의 범위를 가장 최상한인 Number클래스와 그 하위타입인(Integer, Double)만 받겠다는 뜻
출처
'JAVA' 카테고리의 다른 글
[JAVA] 람다식의 메서드 참조 (1) | 2024.05.02 |
---|---|
[JAVA] 람다 표현식을 사용하는 함수형 인터페이스 (0) | 2024.05.02 |
[JAVA] Optional의 개념과 사용법, 주의할 점 (0) | 2024.05.01 |
[JAVA] 스트림이 동작할 때(생성, 중간 연산, 최종 연산) 사용하는 메서드 (0) | 2024.05.01 |
[JAVA] 스트림 API(특징, 스트림의 동작 흐름, 컬랙션과의 차이) (1) | 2024.05.01 |