제네릭(Generic)에 대한 모든 것(제네릭에 대해서 설명해주세요)
제네릭(Generic)
제네릭 타입을 이용해서 컴파일 과정에서 타입 체크를 할 수 있다.
제네릭은 클래스와 인터페이스, 메소드를 정의할 때 타입 파라미터로 사용한다.
* 제네릭을 사용하는 이유(=장점)
1. 컴파일할 때 타입을 체크해서 에러를 사전에 잡을 수 있다.
2. 컴파일러가 타입캐스팅을 해주기 때문에 개발자가 편리하다.
3. 타입만 다르고 코드의 내용이 대부분 일치할 때, 코드의 재사용성이 좋아진다.
1 2 3 | public class className<T>{...} public interface interfaceName<T>{...} |
* 클래스, 인터페이스에서 제네릭 타입파라미터 사용법
- 실제 사용할 시에는 타입 파라미터에 구체적인 타입을 지정해야 함.
1 | ArrayList<String> list = new ArrayList<String>(); |
ArrayList에 String 값만 저장할 수 있도록 구체적인 타입을 지정했음.
* 멀티 타입 파라미터
1 | HashMap<String,Object> map = new HashMap<String,Object>(); |
제네릭 타입을 2개 이상 만들 수 있음.
해시맵도 <K,V>로 제네릭 타입을 사용하고 있음.
* 제네릭 메소드
매개변수 타입과 리턴 타입으로 타입파라미터를 갖는 메소드.
제네릭 클래스가 아니여도 메소드만 제네릭 메소드일 수 있음.
1 | public <T> Product<T> boxing(T t){...} |
* 제한된 타입 파라미터
<T extends 타입>
타입 파라미터에 지정되는 구체적인 타입을 제한할 필요가 있을 때가 있다.
ex) 숫자 연산 제네릭 메소드는 Byte, Short, Integer, Long, Double 인스턴스만 가져야 한다. 이럴 때 Number타입으로 제한한다. <T extends Number>
Number타입 또는 Number타입의 하위 클래스 타입만 올 수 있음.
<T super 타입> 으로 상위클래스도 표현가능하지만 <T implements 타입>같은 표현은 없음.
만약 인터페이스로 제한하고 싶다할지라도 "extends" 를 사용해야 함.