[핵심 정리]
- 클라이언트에서 매개변수와 반환값을 명시적으로 형변환해야 하는 메서드보다 제네릭 메서드가 더 안전하고 사용하기도 쉽다.
- 메서드도 형변환 없이 사용할 수 있는 것이 훨씬 좋고 그렇게 사용하고자 한다면 제네릭 메서드로 만들어 사용하면 된다.
- 타입 역시 마찬가지로 형변환을 해줘야하는 기존 메서드는 제네릭으로 만들자
public class Box<T>{ ... }
형식이 제네릭 클래스라고 할수 있다.public static Set<E>
public static Set union(Set s1, Set s2){
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
public static <E> Set<E> union(Set<E> s1, Set<E> s2){ // 메서드 선언에서 세 집합의 원소 타입을 타입 매개변수로 명시
Set<E> result = new HashSet(s1);// 메서드 안에서 이 타입 매개변수만을 사용하게 수정
result.addAll(s2);
return result;
}
E
>를 사용해줌으로 제네릭 메서드를 선언하고 있습니다. 이것은 메서드에 대한 제네릭 타입 매개변수를 나타냅니다.String
> union()과 차이?Set<String>
이라는 반환 타입을 정의하고 있을 뿐 제네릭 사용에 대한 처리는 없다.T
>public class SingletonFactory {
private static final SingletonFactory instance = new SingletonFactory();
private SingletonFactory() {
// private 생성자로 외부에서 직접 인스턴스 생성을 막음
}
public static SingletonFactory getInstance() {
return instance;
}
public SomeSingletonObject createSingletonObject() {
// 여기서 단일 객체를 생성하거나 반환하는 로직을 구현할 수 있음
return SomeSingletonObject.getInstance();
}
}
class SomeSingletonObject {
private static final SomeSingletonObject instance = new SomeSingletonObject();
private SomeSingletonObject() {
// private 생성자로 외부에서 직접 인스턴스 생성을 막음
}
public static SomeSingletonObject getInstance() {
return instance;
}
public void doSomething() {
// 필요한 동작 구현
}
}
public class Factory<T> {
private Map<Class<? extends T>, Supplier<? extends T>> map = new HashMap<>();
private Factory() {
// private 생성자로 외부에서 직접 인스턴스 생성을 막음
}
public static <T> Factory<T> create() {
return new Factory<>();
}
public <E extends T> void register(Class<E> clazz, Supplier<E> supplier) {
map.put(clazz, supplier);
}
public <E extends T> E createObject(Class<E> clazz) {
Supplier<? extends T> supplier = map.get(clazz);
if (supplier == null) {
throw new IllegalArgumentException("Class not registered: " + clazz);
}
return clazz.cast(supplier.get());
}
}