Java 제네릭
Java 제네릭
- 제네릭은 클래스, 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있도록 한다.
- 컴파일 시 강한 타입 체크를 할 수 있다.
- 타입 변환을 제거한다.
제네릭 사용방법
- 타입
타입 | 설명 |
---|---|
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
- 클래스, 인터페이스 선언
// 클래스 선언
public class 클래스명 <T> { ... }
// 인터페이스 선언
public interface 인터페이스명 <T> { ... }
// HashMap 선언
public class HashMap <K, V> { ... }
- 선언한 제네릭 클래스 사용
- 객체를 생성할 때 구체적인 타입을 명시해 준다.
public class ClassName <T, K> { ... }
public class Main {
public static void main(String[] args) {
ClassName<String, Integer> a = new ClassName<String, Integer>();
}
}
// 이와 같이 사용자가 정의한 클래스도 참조타입으로 넣을 수 있다.
public class ClassName <T> { ... }
public class Student { ... }
public class Main {
public static void main(String[] args) {
ClassName<Student> a = new ClassName<Student>();
}
}
제한 된 제네릭과 와일드카드
- 선언한 제네릭을 특정 범위 내로 제한하고 싶을 때 사용하는 방법
- extends, super, ?(알 수 없는 타입)
<K extends T> // T와 T의 자식 타입만 가능 (K는 들어오는 타입으로 지정 됨)
<K super T> // T와 T의 부모 타입만 가능 (K는 들어오는 타입으로 지정 됨)
<? extends T> // T와 T의 자식 타입만 가능
<? super T> // T와 T의 부모 타입만 가능
<?> // 모든 타입 가능. <? extends Object>랑 같은 의미