본문 바로가기

반응형

이번 글에서는 제네릭 타입 매개변수에 제한을 두는 방법을 배웁니다.
<T extends Number>처럼 extends 키워드를 사용하면,
해당 제네릭 메서드는 Number를 상속한 타입(예: Integer, Double, Float)만 사용할 수 있게 제한됩니다.


📌 예제 코드

public class GenericExample {
    // Number를 상속한 타입만 허용하는 제네릭 메서드
    public static <T extends Number> boolean compare(T t1, T t2) {
        System.out.println("compare(" + t1.getClass().getSimpleName() + ", " + t2.getClass().getSimpleName() + ")");
        double v1 = t1.doubleValue();
        double v2 = t2.doubleValue();
        return (v1 == v2);  // double 값으로 비교
    }

    public static void main(String[] args) {
        boolean re = compare(10, 20);     // Integer 비교
        System.out.println(re + "\n");

        re = compare(4.5, 4.5);           // Double 비교
        System.out.println(re);
    }
}

💻 실행 결과

compare(Integer, Integer)
false

compare(Double, Double)
true

💬 코드 설명

  • <T extends Number>는 이 메서드가 Number 또는 그 자식 타입만 인자로 받을 수 있도록 제한합니다.
  • t1.doubleValue()는 Number 클래스에 정의된 메서드로, int, float, double 값을 double형으로 변환해줍니다.
  • compare(10, 20)은 10.0 == 20.0 비교 → false
  • compare(4.5, 4.5)는 4.5 == 4.5 → true
  • t1.getClass().getSimpleName()은 콘솔에 전달된 타입 이름을 출력하기 위해 사용되었습니다.

💡 포인트 정리

  • T extends Number는 해당 제네릭이 Number의 자식만 받도록 제한합니다.
  • 이 방식은 특정 기능(예: 숫자 연산)을 보장하고 싶은 경우 유용합니다.
  • 대표적인 Number 하위 클래스: Integer, Double, Float, Long, Short, Byte
  • 타입 제한을 통해 불필요한 타입 사용을 컴파일 단계에서 차단할 수 있습니다.

📌 정리하자면, <T extends Number>처럼 타입을 제한하면,
숫자 타입에만 특화된 기능을 안전하게 제공할 수 있어 코드 신뢰성과 가독성이 높아집니다.
이는 제네릭의 강력한 확장성과 타입 안전성을 동시에 활용하는 대표적인 예입니다.

댓글