Generic<T>의 클래스처럼, 제네릭을 사용한 클래스를 제네릭 클래스라고 한다.<>사이에 들어가는 변수명 T는 타입 변수라고 한다. public class Generic<T> { ... }
Generic<String> stringGeneric = new Generic<>();
// 1.
public class Generic<T> {
// 2.
private T t;
// 3.
public T get() {
return this.t;
}
public void set(T t) {
this.t = t;
}
public static void main(String[] args) {
// 4.
Generic<String> stringGeneric = new Generic<>();
// 5.
stringGeneric.set("Hello World");
String tValueTurnOutWithString = stringGeneric.get();
System.out.println(tValueTurnOutWithString);
}
}
static T get() { ... } // 에러
static void set(T t) { ... } // 에러
public class Generic<T, U, E> {
public E multiTypeMethod(T t, U u) { ... }
}
Generic<Long, Integer, String> instance = new Generic();
instance.multiTypeMethod(longVal, intVal);
<? extends T> : T와 그 자손들만 사용 가능<? super T> : T와 그 조상들만 가능<?> : 제한 없음 public class ParkingLot<T extends Car> { ... }
ParkingLot<BMW> bmwParkingLot = new ParkingLot();
ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!
public static <T extends Comparable<? super T>> void sort(List<T> list) { ... }
또는
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
// <T extends Comparable<? super T>> : generic 타입
// <T extends Comparable<T>> : Comparable 인터페이스를 구현한 클래스 타입
// <? super T> : T와 타입이 같거나 조상클래스만 ?에 가능하다는 뜻
// ex. A클래스가 있고 A클래스의 조상 B가 있다고 가정했을 때, ?에는 A, B, Object가 가능
// void : return 타입
// sort : 함수 이름
// List<T> list : 매개변수

static <T> T 함수명(T 매개변수) {
...
}
// static : 호출 시에 매게 타입을 지정하기 때문에 static이 가능 ( static이 아니어도 됨 )
// <T> : Generic 타입
// T : 리턴 타입 (다른 타입으로 지정해도 상관 없음)
// 함수명 : 사용자가 지정한 함수 이름
// T : 매개변수의 타입 ( U, E 등으로 다른 이름으로 지정해서 활용 가능 )
즉, T, U, E 등은 모두 표현의 방식일 뿐이다.
ex.
public class Generic<T, U, E> {
// Generic<T,U,E> 의 T와 아래의 T는 이름만 같을뿐 다른 변수
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
}
https://devlog-wjdrbs96.tistory.com/201