* 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반 타입이다.
* 정확히 말하면 지정된다는 것보다 타입의 경계를 지정하고, 컴파일 때 해당 타입으로 캐스팅하여 매개변수화 된 유형을 삭제하는 것이다.
| 타입 | 설명 |
| <T> | Type |
| <E> | Element |
| <K> | Key |
| <V> | Value |
| <N> | Number |
public class ClassName <T> {}
public interface InterfaceName<T> {}
public class ClassName <T, K> {}
public interface InterfaceName<T, K> {}
// HashMap
public class HashMap<K, V> {}
생성시 구체적인 타입을 명시
public class ClassName <T, K> {}
public static void main(String[] args) {
ClassName<String, Integer> a = new ClassName<String, Integer>();
}
T는 String이 되고, K는 Integer가 된다.
이때, 타입 파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)밖에 올 수 없다. 즉, int, double, char 같은 primitive type은 올 수 없다. 그래서 int형 double형 등 primitive Type의 경우 Integer Double 같은 Wrapper Type으로 쓰는 이유가 바로 이런 이유이다.
제네릭 타입을 메소드 리턴 타입 앞에 선언한 메소드를 제네릭 메소드라 한다.
public class Car<T> {
private final T name;
public Car(T name) {
this.name = name;
}
public static <M> Car<M> from(M name) {
return new Car<>(name);
}
public <M> void printEqualsCar(Car<M> car) {
System.out.println(this.equals(car));
}
}
Car 클래스에서 from메소드, printEqualsCar 메소드가 제네릭 메소드이다. 제네릭 타입은 구분을 위해 컨벤션 타입에 맞지 않는 M으로 지정함.
public static Car<M> from(M name) { // 컴파일 에러
return new Car<>(name);
}
다음과 같이 선언시 컴파일 에러 발생
*제네릭 클래스가 아닌 일반 클래스에서도 제네릭 메소드를 사용할 수 있다.
제네릭은 원하는 타입이 있을 때도 모든 타입이 들어올 수 있다.
ublic class Car<T> {
private final T name;
public Car(T name) {
this.name = name;
}
...
}
public static void main(String[] args) {
Car<Integer> car = new Car<>(1);
}
Car 클래스 인스턴스 변수 name은 문자 관련 타입 지정되기를 원해도 다음과 같이 아무 타입이나 들어올 수 있다.
public class Car<T extends CharSequence> {
private final T name;
public Car(T name) {
this.name = name;
}
...
}
extends 키워드를 사용하여 타입을 제한시킬 수 있다.
CharSequence 인터페이스 하위 객체들만 데이터 타입으로 지정할 수 있게 함으로써 인스턴스 변수 name에 문자열 관련 타입만 지정할 수 있다.
public static void main(String[] args) {
Car<String> car = new Car<>("sports");
}
코드에 선언되고 사용된 제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입 변환된다.
그리고 코드 내의 모든 제네릭 타입은 제거되어, 컴파일 된 class 파일에는 어떠한 제네릭 타입도 포함되지 않게 된다.
참조 :
https://st-lab.tistory.com/153
자바 [JAVA] - 제네릭(Generic)의 이해
정적언어(C, C++, C#, Java)을 다뤄보신 분이라면 제네릭(Generic)에 대해 잘 알지는 못하더라도 한 번쯤은 들어봤을 것이다. 특히 자료구조 같이 구조체를 직접 만들어 사용할 때 많이 쓰이기도 하고
st-lab.tistory.com
https://tecoble.techcourse.co.kr/post/2020-11-09-generics-basic/
자바 제네릭(Generics) 기초
…
tecoble.techcourse.co.kr
http://www.tcpschool.com/java/java_generic_concept
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
| [JAVA] aws s3 image upload (0) | 2023.08.14 |
|---|---|
| [JAVA] List 마지막 값으로 덮어 씌워지는 문제 (0) | 2023.07.31 |
| [JAVA] GC : Garbage Collection (0) | 2023.04.16 |
| [JAVA] 메모리 관리 (0) | 2023.04.14 |
| [Design Pattern] Facade Pattern (0) | 2023.04.06 |