public class IntegerBox {
private Integer value;
public void set(Integer value){
this.value = value;
}
public Integer get(){
return value;
}
}
public class StringBox {
private String value;
public String get() {
return value;
}
public void set(String value) {
this.value = value;
}
}
public class BoxMain1 {
public static void main(String[] args) {
IntegerBox integerBox = new IntegerBox();
integerBox.set(10); //오토 박싱
Integer integer = integerBox.get();
System.out.println("integer = " + integer);
StringBox stringBox = new StringBox();
stringBox.set("Hello");
String str = stringBox.get();;
System.out.println("str = " + str);
}
}
public class ObjectBox {
private Object value;
public Object get() {
return value;
}
public void set(Object value) {
this.value = value;
}
}
Object는 모든 부모 타입, 부모는 자식을 담을 수 있음
public class BoxMain2 {
public static void main(String[] args) {
ObjectBox integerBox = new ObjectBox();
integerBox.set(10); //오토 박싱
Integer integer = (Integer) integerBox.get();
System.out.println("integer = " + integer);
ObjectBox stringBox = new ObjectBox();
stringBox.set("Hello");
String str = (String) stringBox.get();;
System.out.println("str = " + str);
// 인수 잘못 전달 시
integerBox.set("문자 100");
Integer rst = (Integer) integerBox.get(); //String -> Integer 캐스팅 예외
System.out.println("rst = " + rst);
/*
java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer
(java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
at chap32.ex1.BoxMain2.main(BoxMain2.java:17)
*/
}
}
몇가지 문제 있음
반환 타입이 맞지 않는 문제
Integer obj = integerBox.get(); //Object 타입
Integer = Object 성립하지 않는다. -> downCasting 필요
잘못된 타입 인수 전달문제
숫자 타입이지만, 문자 타입이 전달됨
Object를 매개변수로 받기 때문에 어떤 데이터도 입력 받을 수 있다
public class GenericBox<T> {
private T value;
public void set(T value){
this.value = value;
}
public T get() {
return value;
}
}
<>를 사용한 클래스를 제네릭 클래스
제네릭 클래스를 사용할땐 미리 타입을 정하지 않음
<T>와 같이 선언하면, 제네릭 클래스 형성
T = 타입 매개변수
public class BoxMain3 {
public static void main(String[] args) {
GenericBox<Integer> integerBox = new GenericBox<Integer>(); //생성 시점에 타입이 결정된다.
integerBox.set(10);
Integer integer = integerBox.get();
System.out.println("integer = " + integer);
GenericBox<String> stringBox = new GenericBox<>();
stringBox.set("hello");
String str = stringBox.get();
System.out.println("str = " + str);
//모든 타입 적용 가능
GenericBox<Double> doubleBox = new GenericBox<>();
doubleBox.set(1.12);
Double num = doubleBox.get();
System.out.println("num = " + num);
GenericBox<Integer> integerBox2 = new GenericBox<>(); //추론
}
}
T -> Inter로 형성
GenericBox<String>, GenericBox<Integer>를 형성한다고 해서 같은 코드 생성 되는 것 아님. 대신 자바 컴파일러가 우리가 입력한 타입 정보를 기반으로 이런 코드가 있다고 가정하고 컴파일 과정에 ㅏ입 정보 반영
제네릭의 핵심은 사용할 타입을 미리 결정하지 않는다는 점
해당 클래스를 실제 사용하는 생성 시점에 내부에서 사용할 타입을 결정하는 것이다.