제네릭 정의
자바에서 제네릭이란 데이터 타입을 일반화(generalize) 시킨다는 것을 의미한다.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시 미리 지정하는 방법입니다.
제네릭의 장점
1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다. (잘못된 타입이 들오는 것을 컴파일 단계에서 방지합니다.)
2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. (반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.)
3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아집니다.
JDK 1.5부터 도입된 제네릭을 사용하면 컴파일 시에 미리 타입이 정해지므로, 타입 검사나 타입 변환과 같은 번거로운 작업을 생략할 수 있게 됩니다.
즉, 데이터 형식에 의존하지 않고 하나의 값이 여러 다른 타입들을 가질 수 있도록 하는 방법입니다.
만약에 어떤 자료구조를 만들어 배포하려고 할 때 String, Integer 등등 여러 가지 타입들을 지원하려고 합니다. String, Integer에 대해 각각 만드는 것은 비효율적이므로 이 때 제네릭을 사용합니다.
제네릭은 클래스 내부에서 지정하는 것이 아니라 외부에서 사용자에 의해 정의되는 것을 의미합니다.
즉, 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 일반(Generic) 타입이라는 것입니다.
(정확히 말하면 지정된다는 것 보다는 타입의 경계를 지정하고, 컴파일 때 해당 타입으로 캐스팅하여 매개변수화 된 유형을 삭제하는 것 이다.)
제네릭의 타입들
타입 | 설명 |
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
표와 정확히 일치하지 않고 본인이 원하는데로 사용해도 됩니다만 주로 위와 같이 사용하는 것을 자주 합니다.
제네릭의 선언 및 생성
class MyArray<T> {
T element;
void setElement(T element) {this.element = element;}
T getElement() {return element};
}
T 를 타입 변수(type variable)라고 합니다. 임의의 참조형 타입을 의미합니다.
타입 변수는 클래스뿐만 아니라 메소드의 매개변수나 반환값으로도 사용할 수 있습니다.
위와 같이 선언된 제네릭 클래스를 생성ㅊㅇ할 때에는 타입 변수 자리에 사용할 실제 타입을 명시해야 합니다.
MyArray<Integer> myArr = new MyArray<Integer>();
제네릭 클래스를 생성할 때 사용할 실제 타입을 명시하면, 내부적으로 정의된 타입 변수가 명시된 실제 타입으로 변환되어 처리됩니다.
(이 때 기본 타입을 사용할 수 없습니다. 위의 예제와 같이 래퍼 클래스를 사용해야 합니다.)
제네릭의 제거 시기
자바 코드에서 선언되고 사용된 제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입 변환됩니다.
그 후, 코드 내의 모든 제네릭 타입은 제거되며, 컴파일된 class 파일에는 어떠한 제네릭 타입도 포함되지 않게 됩니다.
이런 식으로 동작하는 이유는 제네릭을 사용하지 않는 코드와의 호환성을 유지하기 위해서 입니다.
도움 :
http://www.tcpschool.com/java/java_generic_concept
https://st-lab.tistory.com/153