- Integer 타입을 담는 클래스, String 타입을 담는 클래스가 있다고 가정하면 이후에 Double, Boolean 등 여러 타입을 담는 클래스를 만들고 싶을 때 수십개의 클래스를 만들어야한다.
- 이 문제를 해결하고자 Generic을 도입한다.
public class GenericBox<T> {
//제네릭 클래스에서는 타입을 미리 결정하지 않는다.
T는 타입 매개변수라고 함.
private T value;
public void set(T value){
this.value = value;
}
public T get(){
return value;
}
}
- <>를 사용한 클래스를 제네릭 클래스라고 한다.
- 미리 타입을 결정하지 않고 < T >와 같이 선언하고 이 T를 타입 매개변수라고 한다.
- 이 T는 이후에 Integer, String 등으로 변할 수 있다.
void method(){
System.out.print("hello");
}
- 위와 같이 메소드를 정의하면 이 메소드는 오직 hello라는 문자열만 출력할 수 있다. 결국 재사용성이 떨어진다
void method(String val = "hello"){
System.out.print(val);
}
- 위와 같이 메소드를 선언하면 재사용성이 높아진다.
//정의
GenericClass<T>
//객체를 생성하는 시점에 타입인자 전달
new GenericClass<String>
//정의
<T> T genericMethod(T t)
//메서드를 호출하는 시점에 타입 인자 전달
GenericMethod.<Integer>genericMethod(i)
메소드는 호출 직전에 타입을 결정하기 때문에 위의 genericMethod() 는 타입이 Integer인 메소드이다.