[Java] 자바 제한된 타입 파라미터 제네릭(Generic) 알아보기

2020-12-04


 

(제네릭의 기초적인 개념과 기존 예제가 궁금하면, 아래 링크로 가서 확인하고 오자.)

seeminglyjs.tistory.com/184

제네릭에는 다양한 타입들이 들어갈 수 있지만, 특정 경우에는 제네릭에 들어갈 타입을 제한시켜야 하는 경우가 있다. 예를 들자면 어떤 클래스 필드에 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의 하위 타입이 아니라 컴파일에서의 오류가 발생한다.