1. 제네릭(Generic)
클래스를 정의할 때, 클래스 안에서 사용되는 자료형을 구체적으로 명시하지 않고 다양한 데이터를 처리할 수 있는 방법
class 클래스명 <영어 대문자> { 영어대문자 변수명 }
class Box<T> {
T data;
}
클래스에 <대문자> 를 사용하면 변수 타입을 정하지 않아도 사용할 수 있다.
class Box<T> {
T data;
}
public class GenericEx01 {
public static void main(String[] args) {
Box<String> box1 = new Box();
Box<Integer> box2 = new Box();
box1.data = "1";
box2.data = 1;
}
}
제네릭을 사용하면 new 할 때 자료형이 정해진다.
2. 오브젝트(Object) vs 제네릭
다형성을 이용하면, 모든 객체는 Object 타입형으로 처리할 수 있다.
class Box {
private Object data;
public void set(Object data) {
this.data = data;
}
public Object get() {
return data;
}
}
public class Generic5 {
public static void main(String[] args) {
Box b = new Box();
b1.set(1);
int i = b1.get();
}
}
자료형을 Object 로 처리했다. set 메서드를 통해 변수를 입력받고 get 메서드를 통해 값을 리턴한다.
변수형은 사용자가 메인 메서드에서 정할 수 있다.

하지만 Object 를 사용하면 문제가 있다. Object 값을 저장할 때 오류가 발생한다. 리턴되는 값이 Object 형이기 때문에 사용할 int 나 String 보다 더 큰 자료형이기 때문이다. 그래서 다운캐스팅을 사용해서 값을 저장해야 한다.
int i = (Integer) b1.get(); // Object 형을 Integer 형으로 다운캐스팅

이때 제네릭을 이용하면 문제를 쉽게 해결할 수 있다.
class Box<T> {
private T data;
public void set(T data) {
this.data = data;
}
public T get() {
return data;
}
}
public class Generic5 {
public static void main(String[] args) {
Box<String> b1 = new Box();
b1.set("hello");
int i = b1.get();
}
}
같은 코드를 제네릭을 이용해 만들었다. Object 를 대문자 T로 자료형을 변경했다.
제네릭을 이용해면 객체를 생성할 때 타입을 정할 수 있다.

정수형을 사용하기 원한다면 int 가 아니라 Integer 를 이용하면 된다.
Box<Integer> b1 = new Box();

Share article