T_era
[JAVA] 제너릭의 타입보장 본문
제너릭을 사용하면서 연산자를 사용하고싶어 학습해보았다
"T라는 타입 파라미터는 Number 클래스를 상속받은 타입만 될 수 있다" 라고 제한을 거는 것
이렇게 함으로써, 여러분은 제네릭 클래스나 메서드 내에서 T 타입의 객체에 대해 Number 클래스가 제공하는 공통적인 기능을 안전하게 사용할 수 있게 된다. 컴파일러가 T가 항상 Number의 하위 타입임을 보장해주기 때문에, 타입 에러 걱정 없이 코드를 작성할 수 있고, 원하던 연산자도 사용할 수 있게 된다
<T extends Number>의 장점
- 타입 안전성 확보: 특정 숫자 타입(Integer, Double, Float 등)만 다루는 로직을 만들 때, 실수로 다른 타입의 객체가 들어오는 것을 막아주고, 컴파일 시점에 타입 체크가 이루어지므로 런타임 에러를 줄일 수 있다.
- 코드 재사용성 증대: 특정 숫자 타입에 종속되지 않고, Number 클래스의 공통 기능을 활용하여 다양한 숫자 타입을 처리하는 코드를 한 번만 작성할 수 있다.
- 명확한 의도 표현: <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 |