제네릭이란 ?
제네릭(Generic)은 직역하자면 '일반적인'이라는 뜻이다.
'데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법'입니다.
기본적으로 ArrayList, LinkedList 를 생성할 때는 아래와 같이 생성을 합니다.
ArrayList<Integer> Lst = new ArrayList<Integer>();
ArrayList<String> Lst2 = new ArrayList<Integer>();
LinkedList<Double> Lst3 = new LinkedList<Double>():
LinkedList<Character> Lst4 = new LinkedList<Character>();
이렇게 <> 괄호 안에 어떤 타입이 들어갈 지를 지정해줍니다.
제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다. 한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것이다.
제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
제네릭을 사용하지 않을 경우
public class Box {
private Object obj;
public void setObj(Object obj){
this.obj = obj;
}
public Object getObj(){
return obj;
}
}
public class BoxExam {
public static void main(String[] args) {
Box box = new Box();
box.setObj(new Object());
Object obj = box.getObj();
box.setObj("hello");
String str = (String)box.getObj();
System.out.println(str);
box.setObj(1);
int value = (int)box.getObj();
System.out.println(value);
}
}
여기서의 Box 클래스는 매개변수를 Object 하나만 받아들이는 것을 볼 수 있습니다.
즉 Object란 String, Integer, Double 등 Object 후손을 모두 받아들일 수 있습니다.
제네릭을 사용하게 되면 어떤 타입을 인스턴스를 만들때 사용할지 지정해줄 수 있습니다.
public class Box<E> {
private E obj;
public void setObj(E obj){
this.obj = obj;
}
public E getObj(){
return obj;
}
}
위와 같이 Box 옆에 → Element 가 제네릭을 적용한 예시로 볼 수 있습니다.
Box는 가상의 클래스 E를 사용합니다.
public class BoxExam {
public static void main(String[] args) {
Box<Object> box = new Box<>();
box.setObj(new Object());
Object obj = box.getObj();
Box<String> box2 = new Box<>();
box2.setObj("hello");
String str = box2.getObj();
System.out.println(str);
Box<Integer> box3 = new Box<>();
box3.setObj(1);
int value = (int)box3.getObj();
System.out.println(value);
}
}
BoxExam 클래스를 위와 같이 변경할 수 있습니다.
제네릭을 사용한 부분에 참조 타입으로 Object, String, Integer 가 있는 것을 볼 수 있습니다.