Object는 모든 클래스의 부모이므로 모든 타입의 객체를 저장할 수 있다.
따라서 다형성을 참조하면 이전에 다룬 문제를 해결할 수 있을 것이다.
package generic.ex1;
public class ObjectBox {
private Object value;
public void set(Object object) {
this.value = object;
}
public Object get() {
return value;
}
}
ObjectBox는 내부에 Object 타입의 value 필드를 가지고 있다.
따라서 Integer, String 등 모든 객체를 저장할 수 있다.
Object는 자식을 담을 수 있으므로 모든타입의 objectBOX를 담을 수 있다.
package generic.ex1;
public class BoxMain2 {
public static void main(String[] args) {
ObjectBox integerBox = new ObjectBox();
integerBox.set(10);
Integer integer = (Integer) integerBox.get(); //Object -> Integer 캐스팅
System.out.println("integer = " + integer);
ObjectBox stringBox = new ObjectBox();
stringBox.set("hello");
String str = (String) stringBox.get(); //Object -> String 캐스팅
System.out.println("str = " + str);
//잘못된 타입의 인수 전달시
integerBox.set("문자100");
Integer result = (Integer) integerBox.get(); // String -> Integer 캐스팅
예외
System.out.println("result = " + result);
}
}
현재 integerBox를 만들었다.
숫자를 입력하는 부분에는 문제가 없어 보이지만, integerBOX.get()을 호출할 때 문제가 생긴다.
integerBOX.get()은 Object 타입이기 때문이다.
Integer integer = (Integer) integerBox.get();
따라서, 다운캐스팅이 필수적이다.
stringBox도 위와 마찬가지다.
다형성을 활용한 덕분에 코드의 중복을 제거하고, 기존코드를 재사용할 수 있게 되었다.
다만, 입력할 때는실수로 원하지 않는 타입이 들어갈 수 있는 타입 안전성 문제가 발생한다.
결과적으로 이 방식은 타입 안전성이 떨어진다.
지금까지 개발한 프로그램은 코드 재사용과 타입 안전성이라는 2마리 토끼를 한번에 잡을 수 없다. 코드 재사용을 늘리
기 위해 Object 와 다형성을 사용하면 타입 안전성이 떨어지는 문제가 발생한다.