앞서 제네릭 타입에 대한 예제를 살펴보기 위해서, 비제네릭 방식으로 구현한 예제를 살펴보았습니다. 비교를 위해서 예제를 다시 한번 보도록 하겠습니다.
public class Box {
private Object object;
public void set(Object object) {
this.object = object;
}
public Object get() {
return object;
}
}
public class Apple {
}
public class ExampleMain {
public static void main(String[] args) {
Box box = new Box();
box.set("테스트");
String name = (String) box.get();
System.out.println(name);
box.set(new Apple());
Apple apple = (Apple) box.get();
}
}
/* 출력
테스트
*/
이제 위의 예제를, 제네릭을 활용해서 구현하는 연습을 해보겠습니다.
제네릭을 통해서 구현하고자 하는 방향은 다음과 같습니다. 위 코드에서 문제가 되는 부분은 캐스팅(강제 타입변환)이 일어나는 부분입니다. 이 캐스팅이 일어나지 않도록 하는 것이 목표인데, Box 클래스를 어떻게 제네릭 타입으로 선언하는지 짚어보겠습니다.
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
위에서 기존 예제의 Object 타입 객체가 선언된 부분은 T로 모두 대체되었습니다. 이제 중요한 것은, T라는 타입 파라미터가 언제 타입이 구체적으로 부여되는지 여부입니다. 그것은 바로 Box 클래스의 인스턴스가 생성되는 시점 입니다. 즉, new 키워드가 사용되는 시점이란 뜻이겠죠?
// 예시, String 타입으로 선언할 경우
Box<String> box = new Box<String>();
이제 바로 실행 클래스에서 Box<T> 클래스를 사용하는 예제를 생성해 보도록 하겠습니다. 두 개의 Box 인스턴스를 생성하되 하나는 String 타입, 다른 하나는 Integer 타입으로 생성해 보겠습니다.
public class ExampleMain {
public static void main(String[] args) {
Box<String> box1 = new Box<String>();
box1.set("Hello World");
String str = box1.get();
System.out.println(str);
Box<Integer> box2 = new Box<Integer>();
box2.set(999);
int value = box2.get();
System.out.println(value);
}
}
/* 출력
Hello World
999
*/
위에서 box1과 box2 변수로 제네릭 타입 클래스의 인스턴스를 생성해 사용해 보았습니다. box1, box2 인스턴스가 생성되었을 때 Box<T>에서는 클래스의 선언문이 어떻게 변경되었을까요? 타입 파라미터 <T>가 인스턴스 선언 당시 선언한 타입으로 변경되었을 것입니다. 아래의 예제처럼요.
public class Box<String> {
private String t;
public void set(String t) {
this.t = t;
}
public String get() {
return t;
}
}
public class Box<Integer> {
private Integer t;
public void set(Integer t) {
this.t = t;
}
public Integer get() {
return t;
}
}
실제로 위와 같은 형태의 제네릭 타입 클래스로 변화하기 때문에, get()을 사용할 때 캐스팅을 하지 않더라도 자연스럽게 해당 타입의 값만 입력되기 때문에 문제가 발생하지 않는 것입니다.
'Programming > JAVA' 카테고리의 다른 글
제네릭(3) - 제네릭 메서드 1 (0) | 2023.04.27 |
---|---|
제네릭(2) - 멀티타입 파라미터 (0) | 2023.04.26 |
제네릭(1) - 제네릭 타입 1 (0) | 2023.04.25 |
중첩 클래스&인터페이스(5) - 익명 객체 7 (0) | 2023.04.23 |
중첩 클래스&인터페이스(5) - 익명 객체 6 (0) | 2023.04.23 |