자바에서 제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미한다.
데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법이다.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.
이렇게 컴파일 시에 미리 타입 검사(type check)를 수행하면 다음과 같은 장점을 가진다.
클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다
반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
Box<Apple> aBox = new Box<Apple>(); // T를 Apple로 결정
Box<Orange> oBox = new Box<Orange>(); // T를 Orange로 결정
aBox.set(new Apple()); // 사과를 상자에 담는다.
oBox.set(new Orange()); // 오렌지를 상자에 담는다.
Apple ap = aBox.get(); // 사과를 꺼내는데 형 변환 하지 않는다.
Orange og = oBox.get(); // 오렌지를 꺼내는데 형 변환 하지 않는다.
System.out.println(ap); // 출력 : 이것은 사과 입니다.
System.out.println(og); // 출력 : 이것은 오렌지 입니다.
public class Box {
private Object ob;
public void set(Object ob) {
this.ob = ob;
}
public Object get() {
return ob;
}
}
public class Apple {
@Override
public String toString() {
// TODO Auto-generated method stub
return "I am an apple";
}
}
public class Orange {
@Override
public String toString() {
// TODO Auto-generated method stub
return "I am an orange";
}
}
Person<String, Integer> p = new Person<String, Integer>();
p.set("홍길동", 25);
System.out.println(box); //출력 : 홍길동 25 세 입니다.
public class Person<NAME, AGE> {
private NAME name;
private AGE age;
public void set(NAME name, AGE age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name + " " + age +"세 입니다.";
}
}