제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시 미리 지정하는 방법이다.
타입이 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것이며, 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 타입이다.
미리 타입 검사 시 장점
클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
타입체크와 형변환을 생략하므로 코드가 간결하다.
1-1. Generic 선언 및 생성
class MyArray<T> {
T element;
void setElement(T element) { this.element = element; }
T getElement() { return element; }
}
// 클래스 선언
public class ClassName <T> { ... }
// 인터페이스 선언
public interface InterfaceName <T> { ... }
// 제네릭 클래스 생성
MyArray<Integer> myArr = new MyArray<Integer>();
// Java SE 7부터 가능한 인스턴스 생성시 타입 추정
MyArray<Integer> myArr = new MyArray<Integer>();
타입 파라미터(<>) 안에는 T가 아닌 다른 문자 사용 가능하며, 여러개의 타입 변수는 쉼표(,)로 구분하여 명시한다.
타입 변수는 클래스 및 메소드의 매개변수나 반환값으로도 사용 가능하다.
제네릭 클래스 생성시 타입 변수 자리에 사용할 실제 타입을 명시한다.
1-2. Generic Type
타입
설명
<T>
Type
<E>
Element
<K>
Key
<V>
Value
<N>
Number
<R>
Return, Result
제네릭 타입이란 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 의미한다.
2. Generic Method
public <타입 파라미터> 리턴타입 메소드명(매개변수, ...) { ... }
public static <T> void sort(...) {...}
제네릭 메소드란 메소드의 선언부에 타입 변수(generic)를 사용한 메소드를 의미한다.
타입 변수의 선언은 메소드 선언부 반환 타입 바로 앞에 위치한다.
제네릭 클래스에 정의된 타입 매개변수와 제네릭 메소드에 정의된 타입 매개변수는 완전 별개이다.