T_era

[JAVA] 제너릭의 타입보장 본문

Programing/Java

[JAVA] 제너릭의 타입보장

블스뜸 2025. 4. 18. 14:41

제너릭을 사용하면서 연산자를 사용하고싶어 학습해보았다

"T라는 타입 파라미터는 Number 클래스를 상속받은 타입만 될 수 있다" 라고 제한을 거는 것

이렇게 함으로써, 여러분은 제네릭 클래스나 메서드 내에서 T 타입의 객체에 대해 Number 클래스가 제공하는 공통적인 기능을 안전하게 사용할 수 있게 된다. 컴파일러가 T가 항상 Number의 하위 타입임을 보장해주기 때문에, 타입 에러 걱정 없이 코드를 작성할 수 있고, 원하던 연산자도 사용할 수 있게 된다

<T extends Number>의 장점

  1. 타입 안전성 확보: 특정 숫자 타입(Integer, Double, Float 등)만 다루는 로직을 만들 때, 실수로 다른 타입의 객체가 들어오는 것을 막아주고, 컴파일 시점에 타입 체크가 이루어지므로 런타임 에러를 줄일 수 있다.
  2. 코드 재사용성 증대: 특정 숫자 타입에 종속되지 않고, Number 클래스의 공통 기능을 활용하여 다양한 숫자 타입을 처리하는 코드를 한 번만 작성할 수 있다.
  3. 명확한 의도 표현: <T extends Number>를 사용하면 개발자가 "이 코드는 숫자와 관련된 작업을 수행한다"라는 의도를 명확하게 드러낼 수 있다.

숫자 컬렉션 예시: List<Integer>, List<Double> 등 숫자 리스트를 처리하는 클래스를 만들 때, <T extends Number>를 사용하여 숫자 타입만 허용하도록 제한하여 사용할 수 있다.

class NumberList<T extends Number> {
    private List<T> numbers = new ArrayList<>();

    public void addNumber(T number) {
        numbers.add(number);
    }

    public double calculateSum() {
        double sum = 0;
        for (T number : numbers) {
            sum += number.doubleValue(); // Number 클래스의 메서드 활용
        }
        return sum;
    }
}

public class Example {
    public static void main(String[] args) {
        NumberList<Integer> integerList = new NumberList<>();
        integerList.addNumber(10);
        integerList.addNumber(20);
        System.out.println("Integer 리스트 합계: " + integerList.calculateSum()); // 출력: Integer 리스트 합계: 30.0

        NumberList<Double> doubleList = new NumberList<>();
        doubleList.addNumber(3.14);
        doubleList.addNumber(2.71);
        System.out.println("Double 리스트 합계: " + doubleList.calculateSum()); // 출력: Double 리스트 합계: 5.85
    }
}

 

숫자 연산 유틸리티: 숫자들의 평균, 최대/최소값을 구하는 등의 유틸리티 메서드를 만들 때, <T extends Number>를 사용하여 다양한 숫자 타입을 처리할 수 있도록 만들 수 있다.

class NumberUtils {
    public static <T extends Number> double average(List<T> numbers) {
        if (numbers == null || numbers.isEmpty()) {
            return 0;
        }
        double sum = 0;
        for (T number : numbers) {
            sum += number.doubleValue();
        }
        return sum / numbers.size();
    }
}

public class Example2 {
    public static void main(String[] args) {
        List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);
        System.out.println("정수 리스트 평균: " + NumberUtils.average(intList)); // 출력: 정수 리스트 평균: 3.0

        List<Float> floatList = Arrays.asList(1.5f, 2.5f, 3.5f);
        System.out.println("실수 리스트 평균: " + NumberUtils.average(floatList)); // 출력: 실수 리스트 평균: 2.5
    }
}

 

요약

  • <T extends Number>는 제네릭 타입 T를 Number 클래스 또는 그 하위 클래스로 제한한다
  • 타입 안전성을 높이고, 코드 재사용성을 증대시키며, 코드의 의도를 명확하게 한다
  • 숫자 컬렉션 처리, 숫자 연산 유틸리티 등 다양한 상황에서 활용될 수 있다.

 

 

'Programing > Java' 카테고리의 다른 글

JavaDoc 주석이란?  (0) 2025.05.13
[JAVA] Optional이란?  (0) 2025.04.21
[JAVA] 문법정리 - 2  (0) 2025.04.15
[JAVA] 문법정리  (0) 2025.04.15
[JAVA] Map에 객체를 value로 하기 위한 메서드  (0) 2025.04.14