1. 정의
- 타입을 일반화 하는 것을 의미
- 클래스 내부에서 정하는 것이 아닌 사용자 호출에 의해 타입이 지정되는 것
- class / interface / method 등의 타입을 파라미터로 사용할 수 있게 해주는 역할
- Java 5 부터 추가된 개념
ex) List<String> list = new ArrayList<>(); // <>는 diamond라고도 하고 제네릭 표현식임
2. 사용하는 이유
1) 재사용성 증가 : 여러 타입의 파라미터를 삽입해 객체를 생성할 수 있기 때문에 코드를 간결하게 하고, 재사용성을 높인다
2) 컴파일 시 타입 에러 발견 가능 : 컴파일시 잘못 사용되는 문제점을 발견할 수 있기 때문에 런타임 단계에서 발견 될 가능성을 방지한다
3) 컴파일러가 타입 변환 수행: 컴파일 단계에서 타입 캐스팅을 해주기 때문에 불필요한 타입 캐스팅을 할 필요 없어진다
3. 사용법
//클래스 선언
public class temp1<T> {...}
//인터페이스 선언
public interface temp2<T> {...}
4. 와일드 카드 (Unknown type)
- Unbound WildCard:
List<?>와 같이 사용한다
내부적으로는 Object로 정의되어서 사용되고 모든 타입을 인자로 받을 수 있다
- Upper Bounded WildCard:
List<? extends Foo> 와 같은 형태로 사용한다
클래스의 자식 클래스만을 인자를 받을 수 있다
- Lower Bounded WildCard:
List<? super Foo> 와 같은 형태로 사용한다
upper bound와는 반대로 특정클래스의 부모 클래스만을 인자로 받는다
사용예시
1. upper bounded wildcard
import java.util.Arrays;
import java.util.List;
class WildcardDemo {
public static void main(String[] args)
{
// Upper Bounded Integer List 선언
List<Integer> list1 = Arrays.asList(4, 5, 6, 7);
// printing the sum of elements in list 결과 값 출력
System.out.println("Total sum is:" + sum(list1));
// Double list 선언
List<Double> list2 = Arrays.asList(4.1, 5.1, 6.1);
// printing the sum of elements in list
System.out.print("Total sum is:" + sum(list2));
}
//upper bounded wildcard를 매개변수로 설정
private static double sum(List<? extends Number> list)
{
double sum = 0.0;
for (Number i : list) {
sum += i.doubleValue();
}
return sum;
}
}
//결과 값
//Total sum is:22.0
//Total sum is:15.299999999999999
extends 는 상한을 지정해 준다
Integer, Double list를 각각 선언한 후에, sum 함수로 전달해서 element들을 모두 더한 결과 값을 출력시킨다
두 list 모두 Number의 하위 객체 이므로 선언 및 사용이 가능함을 확인할 수 있다
2. Lower Bounded Wildcard
import java.util.Arrays;
import java.util.List;
class WildcardDemo {
public static void main(String[] args)
{
// Lower Bounded Integer List 선언
List<Integer> list1 = Arrays.asList(4, 5, 6, 7);
// Integer list object is being passed
printOnlyIntegerClassorSuperClass(list1);
// Number list 선언
List<Number> list2 = Arrays.asList(4, 5, 6, 7);
// Integer list object is being passed
printOnlyIntegerClassorSuperClass(list2);
}
public static void printOnlyIntegerClassorSuperClass(
List<? super Integer> list)
{
System.out.println(list);
}
}
//결과 값
//[4, 5, 6, 7]
//[4, 5, 6, 7]
super는 하한을 지정해준다
Integer, Number list를 선언한 후에, print 하는 함수로 전달한다
두 자료형 모두 Integer의 상위 객체 이므로 선언 및 사용이 가능함을 확인할 수 있다
3. Unbounded Wildcard
import java.util.Arrays;
import java.util.List;
class unboundedwildcardemo {
public static void main(String[] args)
{
// Integer List 선언
List<Integer> list1 = Arrays.asList(1, 2, 3);
// Double list 선언
List<Double> list2 = Arrays.asList(1.1, 2.2, 3.3);
printlist(list1);
printlist(list2);
}
private static void printlist(List<?> list)
{
System.out.println(list);
}
}
//결과
//[1, 2, 3]
//[1.1, 2.2, 3.3]
와일드카드 ?는 경계가 없다
따라서 어떤 자료형이든 상관 없이 object로 받아 실행한다
참고
https://life-with-coding.tistory.com/489
https://velog.io/@eversong/Java-Generic-WildCard%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C
https://www.geeksforgeeks.org/wildcards-in-java/
'Language > Java' 카테고리의 다른 글
Java Basic (0) | 2022.07.22 |
---|