제네릭 타입이란?
타입을 파라미터로 가지는 클래스와 인터페이스
상속과 구현에 사용될 수 있음
public class 클래스명<T> { ... }
public interface 인터페이스명<T> { ... }
// 혹은
public class 클래스명<T, M> { ... }
public interface 인터페이스명<T, M> { ... }
→ 제네릭 타입의 장점
1. 컴파일 시 강한 타입 체크
: 타입 에러 방지
2. 타입 변환 제거
: 요소를 명시하기 때문
- 예시
// Box 클래스 선언
public class Box<T> {
private T object;
public T get() { return t; }
public void set(T t) { this.t = t; }
}
// Box 제네릭 타입 이용
public class BoxExample {
public static void main(String[] args) {
Box<String> box1 = new Box<String>();
box1.set("hello");
String str = box1.get();
Box<Integer> box2 = new Box<Integer>();
box2.set(6);
int value = box2.get();
}
}
제네릭 메소드
: 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드
public <타입 파라미터1, 타입 파라미터2, ...> 리턴타입 메소드명(매개변수1, 매개변수2, ...) { ... }
- 예시
// 제네릭 메소드 선언
public class Util {
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
boolean keyCompare = p1.getKey().equals(p2.getKey());
boolean valueCompare = p1.getValue().equals(p2.getValue());
return keyCompare && valueCompare;
}
}
// 제네릭 메소드 사용
public static void main(String[] args) {
Pair<Integer, String> p1 = new Pair<Integer, String>("user1", "홍길동");
Pair<Integer, String> p2 = new Pair<Integer, String>("user2", "홍길동");
boolean result = Util.<Integer, String>compare(p1, p2);
}
제한된 타입 파라미터
: 타입을 제한해야 하는 경우, 제한해야 하는 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 됨
public <T extends 상위타입> 리턴타입 메소드(매개변수1, 매개변수2, ...) { ... }
- 예시
public static <T extends Number> int compare(T t1, T t2) { ... }
와일드카드 타입 <?>
: 구체적인 타입을 명시하지 않고 사용 가능
- 제네릭타입<?>
: 모든 클래스나 인터페이스 타입 가능
- 제네릭타입<? extends 상위타입>
: 상위 타입을 제한하여 해당 상위타입의 하위타입만 사용 가능
- 제네릭타입<? super 하위타입>
: 하위 타입을 제한하여 해당 하위타입의 상위타입만 사용 가능
제네릭 타입의 상속과 구현
// 부모 클래스로 사용 예시
public class ChildProduct<T, M, C> extends Product<T, M> { ... }
'Language > Java' 카테고리의 다른 글
Java - 람다식 (0) | 2021.07.18 |
---|---|
Java - 멀티 스레드 정리 (0) | 2021.07.02 |
Java - 기본 API 클래스 정리 (0) | 2021.06.25 |
Java - 중첩 클래스와 중첩 인터페이스, 예외 처리 복습 (0) | 2021.06.25 |
Java - 인터페이스 복습 (0) | 2021.06.24 |