2020-12-04
(제네릭의 기초적인 개념과 기존 예제가 궁금하면, 아래 링크로 가서 확인하고 오자.)
제네릭에는 다양한 타입들이 들어갈 수 있지만, 특정 경우에는 제네릭에 들어갈 타입을 제한시켜야 하는 경우가 있다. 예를 들자면 어떤 클래스 필드에 age(나이)라는 변수가 있다고 가정해 보자. 이러한 경우에는 해당 제네릭 타입을 숫자로 받아야 하기 때문에 Integer / short / double...과 같은 숫자형 타입으로 한정 지을 수 있다. 이를 제한된 타입 파라미터라고 한다.
그러면 이제 구체적인 코드를 살펴보도록 하자.
package Generic1;
public class man2{
public static <T extends Number> int compareAge(T age1, T age2) {
int one = age1.intValue();
int two = age2.intValue();
int big = one >= two ? one : two;
return big;
}
}
코드의 선언 순서는/ public<T extends 상위 타입>/ 리턴 타입 /메서드명(매개변수) /{메서드 구현 내용} /으로 이루어짐
(T자리는 A / B .... / Z9 등 아무거나 가능하다.)
보는 것과 같이 int의 상위 타입인 Number를 제네릭 타입으로 선언해 주었으며, 두 가지 매개변수를 받아 둘 중 큰 값을 리턴하는 간단한 메서드를 구현하였다.
메인클래스로 가 해당 코드를 실행해 보도록 하자.
package Generic1;
public class mainGe {
public static void main(String[] args) {
System.out.println(man2.compareAge(100, 50));
System.out.println(man2.compareAge(100, 50.1)); //double타입이 들어가도 자동으로 int타입으로 변환 후 비교
//System.out.println(man2.compareAge(100, "50.1")); // String 타입이 들어갈 컴파일 오류
}
}
처음 두 가지 출력문은 모두 Number의 하위 타입이기 때문에 자동으로 타입이 변환되어 큰 수를 출력하게 되지만, 마지막 코드의 경우 입력된 타입 String은 Number의 하위 타입이 아니라 컴파일에서의 오류가 발생한다.