본문 바로가기

Java 공부

13장 제네릭(Generic)(4)_제한된 타입 파라미터

타입 파라미터에 지정되는 구체적인 타입을 상속 및 구현 관계를 이용해서 제한할 수 있다.

Public <T extends 상위타입> 리턴타입 메소드(매개변수1,매개변수2, ...) { ... }

--> 상위 타입은 클래스 뿐만 아니라 인터페이스도 가능하다.

*인터페이스라고해서 extends 대신 implements를 사용하지 않는다. 

*여기서 extends는 상속의 개념이 아니라 종류라는 의미라고 생각할 것


- 타입 파라미터를 대체할 구체적인 타입

--> 상위타입이거나 하위 또는 구현 클래스만 지정할 수 있다.

* 즉, 상위타입에 클래스가 왔다면 자식클래스,  상위타입에 인터페이스가 왔다면 구현클래스가 타입파라미터가 될 수 있다.


- 주의할 점

--> 메소드의 중괄호 { } 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버(필드, 메소드)만이 사용 가능하다.

--> 하위 타입에만 있는 필드와 메소드는 사용할 수 없다!


예제>>

제한된 타입 파라미터를 갖는 Util클래스

public class Util {

public static <T extends Number> int compare(T t1, T t2) {

double v1 = t1.doubleValue();

double v2 = t2.doubleValue();

return Double.compare(v1, v2);

}

}


--> public static <T extends Number> int compare(T t1, T t2)

compare메소드의 타입 파라미터<T>에 올 수 있는 타입 파라미터는 Number클래스의 타입 파라미터이거나,

Number클래스의 자식클래스의 타입 파라미터가 될 수 있다.

--> double v1 = t1.doubleValue();

Number클래스의 doubleValue()메소드 사용

Util클래스의 compare메소드의 구현부{}에서는 상위 타입인 Number클래스에 선언된 필드,메소드만을 사용할 수 있다.

--> return Double.compare(v1, v2);

Double클래스의 compare(v1,v2)메소드로  v1<v2 : -1 ,  v1=v2 : 0  , v1>v2 : 1  리턴한다.


실행클래스

public class BoundedTypeParameterExample {

public static void main(String[] args) {


int result1 = Util.compare("a", "b");   //(X)

int result1 = Util.compare(10, 20);

System.out.println(result1);

int result2 = Util.compare(4.5, 3);

System.out.println(result2);

}

}


실행결과

-1

1


-->  int result1 = Util.compare("a", "b");

Util클래스의 compare메소드는 제한된 타입 파라미터로 Number클래스 또는 Number클래스의 자식(하위)클래스만을 가지므로 

String타입을 파라미터로 가질수 없다.

-->  int result1 = Util.compare(10, 20);

10과 20은 Integer이고, Integer는 Number클래스를 상속받는 자식 클래스이므로 타입파라미터로 올 수 있다.

원래는 int result1 = Util.<Integer>compare(10, 20);으로 명시적으로 써줘도 되지만 컴파일러가 매개값을 보고 유추할 수 있으므로 

생략한다.



* 정리 *

- 제네릭을 이용하여 타입 파라미터를 가지는 메소드를 가질 수 있다.

- 타입 파라미터는 상속, 구현 관계를 이용해서 제한하여 사용할 수 있다.

- 제한된 타입 파라미터는 명시된 상위타입, 자식클래스, 구현클래스가 될 수 있다.

- 제한된 타입 파라미터를 사용하는 메소드의 구현부{}에는 반드시 상위타입에 정의되어 있는 필드,메소드 만을 사용할 수 있다.








본 포스팅은 이것은 자바다 책을 참고하여 작성하였습니다.