제네릭은(Generic)은 자료구조 같이 구조체를 직접 만들어 사용할 때 많이 쓰이기도 하고 매우 유용합니다.
제네릭은 직역을 하면 일반적인이라는 뜻입니다. 부연 설명을 하자면 데이터의 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법입니다.
우리가 흔히 사용하는 ArrayList,LinkedList 등을 생성을 할 때 <> 괄호 안에 들어가는 타입을 지정해 줌으로써 사용이 가능합니다.
어떤 자료구조를 만들어 배포를 하려고 하는데, 여러 타입을 지원을 하기 위해서 제네릭을 사용합니다.
즉, 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미합니다.
한마디로 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 것이 제네릭 타입입니다.
타입 | 설명 |
---|---|
Type | |
Element | |
Key | |
Value | |
Number |
보통 제네릭은 표의 타입들이 많이 사용됩니다.
public class ClassName <T> { ... }
public class Student { ... }
public class Main {
public static void main(String[] args) {
ClassName<Student> a = new ClassName<Student>();
}
}
<> 안의 객체의 제네릭 타입을 String, Integer 등의 타입으로 지정을 해서 사용을 합니다.
제네릭 메소드는 매개변수의 타입과 리턴 타입을 제네릭 타입으로 받는 메서드를 이야기합니다.
라는 제네릭 타입을 클래스가 아니라 메소드에 한정해서 사용을 할 수 있습니다.
제네릭을 특정 범위 내로 좁혀서 제한하고 싶을 때는 extends와 super, 그리고 ?(와일드카드)를 해서 사용할 수 있습니다.
<K extends T> // T와 T의 자손 타입만 가능 (K는 들어오는 타입으로 지정 됨)
<K super T> // T와 T의 부모(조상) 타입만 가능 (K는 들어오는 타입으로 지정 됨)
<? extends T> // T와 T의 자손 타입만 가능
<? super T> // T와 T의 부모(조상) 타입만 가능
<?> // 모든 타입 가능. <? extends Object>랑 같은 의미