-
제네릭(Generic)Computer Language/Java 2020. 3. 1. 21:50
출처 : http://tcpschool.com/java/java_generic_concept
- 자바에서의 제네릭이란 데이터의 타입을 일반화 하는것을 말한다. 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일시 미리 지정하는 방법이다. 제네릭을 사용함으로써 얻는 장점은
- 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일수 있다.
- 반환값에 대한 타임 변환 및 타입 검사에 들어가는 노력을 줄일수 있다.
JDK 1.5이전에는 Object 타입을 사용하였지만. 이경우 반환되는 Object를 원하는 타입으로 타입캐스팅이 필요했으며, 이때 오류가 발생할 가능성이 존재했다.
하지만 JDK 1.5부터 도입된 제네릭을 사용하면 컴파일 시에 미리 타입이 정해지므로, 타입검사나 타입 변환과 같은 번거로운 작업을 생략할수 있다.
- Sample Code
package study; import java.util.ArrayList; class LandAnimal { public void crying() { System.out.println("육지동물."); } } class Cat extends LandAnimal { public void crying() { System.out.println("냐옹냐옹."); } } class Dog extends LandAnimal { public void crying() { System.out.println("멍멍."); } } class Sparrow { public void crying() { System.out.println("짹짹!!!"); } } class AnimalList<T> { ArrayList<T> al = new ArrayList<>(); void add(T animal) {al.add(animal);} T get(int index) { return al.get(index); } boolean remove(T animal) { return al.remove(animal); } int size() { return al.size(); } } public class GenericEx01 { public static void main(String[] args) { AnimalList<LandAnimal> landAnimal = new AnimalList<>(); landAnimal.add(new LandAnimal()); landAnimal.add(new Cat()); landAnimal.add(new Dog()); // landAnimal.add(new Sparrow()); for (int i=0; i<landAnimal.size(); i++) { landAnimal.get(i).crying(); } } }
Cat, Dog Class 의경우에는 LandAnimal을 상속 받고 있기때문에 LandAnimal Type이므로 리스트에 추가가 가능하지만 Sparrow Class의 경우 LandAnimal을 상속받고 있지 않기 때문에 추가가 불가능하다
- Generic 제거 시기
제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입 변환 된다. 그리고서 코드 내의 모든 제네릭 타입은 제거되어, 컴파일된 class 파일에는 어떠한 제네릭 타입도 포함되지 않는다 이런식으로 동작하는 이유는 제네릭을 사용하지 않는 코드와의 호환성을 유지하기 위해서다.