선언할 때는 가상의 type, 활용할 때 구체화
클래스를 generic, 일반화한다는 의미이다.
object type을 인자로 받고 이를 return하는 특정 클래스 및 메소드의 type을 임의의 클래스로 바꾸고, 이후 활용할 때마다 직접 해당 type을 지정해주는 것을 통해 형변환의 번거로움을 줄일 수 있는 키워드이다.
아래와 같이 하나의 클래스가 있고, 이 클래스 및 메소드는 Object type을 인자로 받고 return한다고 가정해보자.
public class Box{
private Object obj; //obj type의 obj field 생성
public void setObj(Object obj){
this.obj = obj; //this.obj는 field의 obj, obj는 전달받은 인자
}
public Object getObj(){
return obj;
}
}
이 클래스와 메소드를 활용하는 main 클래스에서는 각각 형변환을 일일이 다 해주어야 한다.
public class BoxTest{
public void main(String[] args){
Box box = new Box();
box.setObj(new Object);
Object obj = box.getObj();
box.setObj("Hello");
String str = (String) box.getObj();
box.setObj(3);
int value = (int) box.getObj();
}
}
위 형변환을 generic을 활용한다면 일일이 형변환을 하지 않고도, 임의의 클래스를 기반으로하여 type 지정을 할 수 있게 된다.
꺾쇠 <>
를 활용하면 generic을 사용할 수 있는데, generic을 활용할 메소드가 존재하는 클래스 부터 generic 인자를 정의해준다.
※ Object type 지정을 해주는 부분에 <E>
사용.
public class Box<E>{
private E obj;
public void setObj(E obj){
this.obj = obj;
}
public E getObj(){
return obj;
}
}
형변환없이 클래스 및 메소드를 사용할 수 있게 된다.
※ 메소드를 활용하는 시점부터, 먼저 해당 클래스 객체를 generic을 통해 선언해주고 이후 메소드 사용 시 형변환 없이 사용한다.
public class BoxTest{
public void main(String[] args){
Box<Object> box = new Box<>;
box.setObj(new Object);
Object obj = box.getObj();
Box<String> box = new Box<>;
box.setObj("Hello");
String str = box.getObj();
Box<int> box = new Box<>;
box.setObj(3);
int value = box.getObj();
}
}
위와 같이 최초 객체를 선언할 떄부터 return type에 대해 지정해주기 때문에, 형변환을 하지 않아도 객체를 받아올 수 있게 된다.