타입 유연하게 다루기
제네릭(Generic)은 결정되지 않은 타입을 파라미터로 처리하고, 실제 사용할 때 파라미터를 구체적인 타입으로 바꾸는 기능이다. (Java 5에서 지원 시작)
// 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. <> 안에 들어가야할 타입을 명시,
//이렇게 new 라고 정의하면 모든 <T>가 String타입으로 변환.
Generic<String> stringGeneric = new Generic<>();
// 5.
stringGeneric.set("Hello World");
String tValueTurnOutWithString = stringGeneric.get();
System.out.println(tValueTurnOutWithString);
}
}
public class Generic<T> { ... }
Generic<String> stringGeneric = new Generic<>();
static T get() { ... } // 에러
static void set(T t) { ... } // 에러
✔️ 타입 변수의 이름을 T로 사용하는 이유는 일종의 컨벤션이기 때문이다.
당연히 컨벤션이기 때문에, 본인이 원하는 어떠한 변수를 넣어도 문제는 없다.
다만 당연히 컨벤션이기 때문에, 굳이 다른 이유가 없다면 T를 사용하는 게 협업에 유리하다. 이와 함께 자주 사용되는 변수명으로는 T,U,V, E 등이 있다.
Generic <T, U, E>
이렇게 다수의 타입변수 사용 가능.
public class Generic<T, U, E> {
public E multiTypeMethod(T t, U u) { ... }
}
Generic<Long, Integer, String> instance = new Generic();
instance.multiTypeMethod(longVal, intVal);
상속과 타입의 관계 가능
와일드 카드
메서드를 스코프로도 선언 가능
여기서 스코프(Scope)란 프로그램상에서 사용되는 변수들의 사용 가능한 범위이다.

제네릭 클래스 안에서만 제네릭 메서드를 사용가능한 게 아니라 메서드 자체만으로도 제네릭으로 만들수 있다.
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
public class Generic<T, U, E> {
// Generic<T,U,E> 의 T와 아래의 T는 이름만 같을뿐 다른 변수
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
}

엄청나게 날린 글씨체지만 공부하면서 적은 메모 첨부..
참고 : Head First Java