< > 안에 적는다
package test05;
class Box{
private Object obj;
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
public class normalBox {
public static void main(String[] args) {
Box box = new Box();
// Object 를 사용하므로, 모두 넣을 수 있다.
box.setObj(11); // 정수형
box.setObj("Hello"); // 문자형
box.setObj(42.11); // 실수형
Object obj = box.getObj();
// 값을 사용하는 순간에는 object로만 꺼낼 수 있고,
// 이를 사용하기 위해서는 전부 형변환을 해줘야 한다.
if (obj instanceof Double) {
System.out.println("실수형의 값입니다.");
} else if (obj instanceof Integer) {
System.out.println("정수형의 값입니다.");
} else if (obj instanceof String) {
System.out.println("문자형의 값입니다.");
}
}
}
package test05;
// < > 안에 타입 파라미터를 정해준다.
class Box<T>{
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public class GenericBox {
public static void main(String[] args) {
// 제네릭 클래스 사용 시점에 매개변수 타입을 정한다 .
// 제네릭에서 타입을 쓸 때, class 명으로 작성해야 한다.
Box<Integer> intbox = new Box<Integer>();
Box<String> strbox = new Box<>(); // 동일한 타입이라면 생략 가능
Box<Double> doublebox = new Box<Double>();
intbox.setT(43); // 타입 안정성을 높여준다.
strbox.setT("Hello");
String value = strbox.getT();
}
}
Box<Student> box = new Box<Student>(); 가능 Box<Person> box = new Box<Student>(); 불가능 public <U> void printClassName(U item) {
System.out.println("Item type : " + item.getClass().getName());
}

class nBox<T extends Integer>{
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public class GenericBox {
public static void main(String[] args) {
nBox<Integer> intbox = new nBox<Integer>();
nBox<String> strbox = new nBox<String>();
}
}

위와 같이 integer 확장된 숫자만 가능하다고 나온다.
? 사용 Box<?> 는 Box<A>, Box<B> 의 부모가 된다. GenericType<?> : 타입에 제한이 없음 GenericType<? extends T> : T와 T를 상속 받은 타입들만 사용 가능 GenericType<? super T> : T와 T의 조상 타입들만 사용 가능 