728x90
타입 매개변수명 작성 규칙
- E - Element
- K - Key
- N - Number
- T - Type
- V - Value
- S, U, V 등 - 2번째, 3번째, 4번째 타입
Generic Method
- 제네릭 메서드는 제네릭 클래스가 아닌 일반 클래스에서도 정의할 수 있다.
- 타입 매개변수는 반환형 앞에 적어야 하며, 이를 반환형으로 사용할 수도 있다.
Class Java {
public static <T> void printAll(T[] arr) {
for (T t : arr) {
System.out.println(t);
}
}
public static void main(String[] args) {
Integer[] numbers = {1,2,3};
String[] strings = {"일","이","삼"};
printAll(numbers);
printAll(strings);
}
}
Generic Constructor
- 생성자명 앞에 적는다.
class 클래스명 {
public <T> 생성자명(T t) {
// ..
}
}
Bounded Type Parameters
- 올 수 있는 타입 인수에 제한을 걸고 싶을 때
- <타입 매개변수 extends 상위 타입 경계>
- 제네릭에서 extends는 단지 상속이 아니라 클래스의 상속(extends), 인터페이스의 구현(implements)를 아우르는 일반적인 의미이다.
class Box<T extends Number> { .. }
Multiple Bounds
- 하나의 경계가 아니라 여러 개의 경계를 가질 수도 있다.
- 이때, 타입 매개변수 T는 경계로 나열된 모든 타입의 하위 타입이다.
- 경계 중 하나가 클래스인 경우에는 클래스가 순서상으로 맨 앞에 와야 한다.
class A { .. }
interface B { .. }
interface C { .. }
class D<T extends A & B & C> { .. }
Wildcards
- 제네릭에서 알 수 없는 타입을 나타낼 때, 와일드카드 (?)를 나타낼 수 있다.
- 상위 타입 경계만 사용할 수 있는 타입 매개변수와는 다르게 와일드카드는 하위 타입 경계도 사용할 수 있다.
🔎 Unbounded Wildcards
- 경계가 없다. 즉, 어떤 타입이 와도 상관이 없다.
// Unbounded Wildcards
public void printList(List<?> list) {
for (Object element : list) {
System.out.print(element + " ");
}
System.out.println();
}
🔎 Upper bounded Wildcards
- 상위 타입 경계를 적어 상위 클래스를 상속받아 사용한다.
// Upper Bounded Wildcards
public double sum(List<? extends Number> list) {
double total = 0;
for (Number element : list) {
total += element.doubleValue();
}
return total;
}
🔎 Lower Bounded Wildcards
- <? super 하위 타입 경계>
- 와일드카드에 오는 타입은 하위 타입 경계인 Integer 이거나 Integer의 상위 타입이어야 한다.
// Lower Bounded Wildcards
public void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 10; i++) {
list.add(i);
}
}
728x90
'Language > Java' 카테고리의 다른 글
Comparable과 Comparator (0) | 2023.05.25 |
---|---|
함수형 인터페이스와 람다식, 메서드 참조 (0) | 2023.05.24 |
열거형(enums) (0) | 2023.05.23 |
중첩 클래스 (0) | 2023.05.22 |
정규표현식 메타문자 목록 (0) | 2023.04.15 |