제네릭
제네릭 : 결정되지 않은 타입을 파라미터로 처리하고, 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능
타입 파라미터 선언 어떻게 하지?
public class Box <T> {
public T content;
}
타입 파라미터 선언 <>
일반적으로 대문자 알파벳 한 글자로 표현(ex. T,E,K,V ...)
지정 안하면 Object 타입 암묵적 사용
<T>는 T가 타입 파라미터임을 뜻하는 기호. 타입이 필요한 자리에 T를 사용할 수 있음
Box<String> box = new Box<String>(); → Box<String> box = new Box<>();
Box<Integer> box = new Box<Integer>(); → Box<Integer> box = new Box<>();
제네릭 타입
결정되지 않은 타입을 파라미터로 가지는 클래스, 인터페이스
public class 클래스명<A, B, ...> {...}
public interface 인터페이스명<A, B, ...> {...}
일반적으로 대문자 알파벳 한 글자로 표현
외부에서 제네릭 타입을 사용하려면? → 타입 파라미터에 구체적 타입 지정. (지정 안하면 Object 타입)
제네릭 메소드
타입 파라미터를 가지고 있는 메소드. 타입 파라미터가 메소드 선언부에 정의됨
리턴 타입 앞에 <> 기호 추가하고 타입 파라미터 정의 후 리턴 타입과 매개변수 타입에서 사용
public <A, B, ...> 리턴타입 메소드명(매개변수, ...) { ... }
<A, B, ...>부분이 타입 파라미터 정의 부분
타입 파라미터 T는 매개값의 타입에 따라 컴파일 과정에서 구체적인 타입으로 대체
public <T> Box<T> boxing(T t) { ... }
제한된 타입 파라미터
모든 타입으로 대체할 수 없음! 특정 타입과 자식 or 구현 관계에 있는 타입만 대체할 수 있는 타입 파라미터, extends 사용
Public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) { ... }
상위 타입은 클래스 뿐만 아니라 인터페이스도 가능
public <T extends Number> boolean compare(T t1, T t2{
double v1 = t1.doubleValue(); //Number의 doubleValue() 메소드 사용
double v2 = t2.doubleValue(); //Number의 doubleValue() 메소드 사용
return (v1 == v2);
}
extends Number 했으니 숫자형만 가능. 문자형 오면 error
와일드카드 타입 파라미터
제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 범위에 있는 모든 타입으로 대체할 수 있는 타입 파라미터.
와일드카드 ? 로 표시
리턴타입 메소드명 (제네릭타입 <? extends Student> 변수 { ... }
리턴타입 메소드명 (제네릭타입 <? super Wroker> 변수 { ... }
리턴타입 메소드명 (제네릭타입 <?> 변수 { ... }