개념
제네릭은 자바에서 데이터 타입을 매개변수로 사용할 수 있게 해주는 기능
제네릭을 사용하면 클래스, 인터페이스, 메서드를 정의할 때 사용할 데이터 타입을 유연하게 지정할 수 있다. 이로 인해 코드의 재사용성을 높이고, 타입 안정성을 높여서 컴파일 타임에 오류를 줄여준다
주요 특징
- 타입 안정성
제네릭을 사용하면 컴파일할 때 타입 체크가 이루어져 런타임 시 타입 오류가 발생하지 않도록 도와준다.- 코드 재사용성
동일한 클래스를 서로 다른 데이터 타입으로 재사용 가능하다- 유연성
제네릭은 다양한 타입의 객체를 수용할 수 있는 유연성을 제공한다.
public class BoxExam {
public static void main(String[] args) {
Box box=new Box();
box.setObj(new Object()); //Object형
box.getObj();
box.setObj("hello");
String str=(String)box.getObj(); // String으로 형변환
box.setObj(1); //int형
int value=(int)box.getObj();
}
}
public class Box<E> {
private Object obj;
public void setObj(Object obj){
this.obj=obj;
}
public Object getObj(){
return obj;
}
}
- box는 Object 형이기 때문에 상황에 맞게 String이나 int로 형변환이 필요하다
public class Box<E> {
private E obj;
public void setObj(E obj){
this.obj = obj;
}
public E getObj(){
return obj;
}
}
- 클래스 이름 뒤에 < E >를 적어 제네릭을 적용한 것이다.
Box 는 가상의 클래스 E 를 사용한다는 의미- Object를 받아들이고, 리턴하던 부분이 E로 변경된다
public class BoxExam {
public static void main(String[] args) {
Box<Object> box=new Box<>(); //Object형
box.setObj(new Object());
Object obj=box.getObj();
Box<String> box2=new Box<>(); //String형
box2.setObj("hello");
String str= box2.getObj();
Box<Integer> box3=new Box<>(); //Integer 형
box3.setObj(1);
int value=box3.getObj();
}
}
- 참조타입에 Object,String,Integer가 있는 것을 볼 수 있다.
- 별도의 형변환이 필요 없이 각각 Object, String, Integer 를 사용하는 Box 인스턴스를 만든다는 의미
정리
- Generic을 사용하여 선언할 때 가상의 타입으로 선언하고, 사용 시 구체적인 타입을 설정함으로써 다양한 타입의 클래스를 이용하는 클래스를 만들 수 있다.