Language/[Java]
[Java] 제네릭을 조금 잘 써보면 어떨까
HiSmith
2023. 6. 18. 21:55
반응형
제네릭을 좀 잘 써보자.
제네릭은 개인적인 생각으로는 인터페이스의 존재이유와 비슷하다고 생각한다.
타입이나 제약을두지 않고, 해당 상속받은 개체에서 자유롭게 짜는것을 의미한다.
예를 바로 들어보자
package com.smith.PqrsFramework.Interface;
public class OrderInterface<T,R> {
T name;
R id;
public T getName(){
return this.name;
}
public R getId(){
return this.id;
}
public void setName(T name){
this.name = name;
}
public void setId(R id){
this.id = id;
}
}
간단하게 제네릭 클래스를 사용하는 방법은 바로 이렇다.
그러면 인터페이스로 바꿔본다면 어떨까?
쉽게 말해서 제네릭 메서드를 생성하는 것이다.
package com.smith.PqrsFramework.Interface;
public interface OrderInterface<T,R> {
T createOrder(R orderInfo);
T updateOrder(R orderInfo);
}
R이라는 객체로 받아서, T라는 객체로 리턴해주는 것이다.
해당 제네릭한 인터페이스를 구현하는 구현체를 자동으로 생성하면 이렇게 생성된다.
package com.smith.PqrsFramework.Interface;
public class AOrderInfaceImpl implements OrderInterface{
@Override
public Object createOrder(Object orderInfo) {
return null;
}
@Override
public Object updateOrder(Object orderInfo) {
return null;
}
}
근데.. 이걸 어찌쓸까...아무도 안쓸것이다.
그래서, 조금 변형을 하려고한다. 특정 제약조건을 넣는것이다. 와일드 카드 개념을 혼재하는 방법인데, 아래와 같이 사용하면 된다.
public interface OrderInterface<T> {
<T extends ResOrder> T createOrder(ReqOrder<T> orderInfo);
<T extends ResOrder> T updateOrder(ReqOrder<T> orderInfo);
}
구현부에서는 아래와 같다.
package com.smith.PqrsFramework.Interface;
public class AOrderInfaceImpl implements OrderInterface{
@Override
public ResOrder createOrder(ReqOrder orderInfo) {
return null;
}
@Override
public ResOrder updateOrder(ReqOrder orderInfo) {
return null;
}
}
근데 좀 아쉬운 부분이 있다.
구현부에서도, 뭔가 제네릭 하게 두고 싶다. 예를 들어, 여러 인터페이스들이 OrderInterface를 구현체로 자리잡는데,
디폴트 메서드만 다르다거나, 그런 상황이 있을수 있기 때문이다.
public class AOrderInfaceImpl<T> implements OrderInterface<T>{
@Override
public <T extends Order> T updateOrder(ReqOrder<T> orderInfo) {
return null;
}
@Override
public <T extends Order> T createOrder(ReqOrder<T> orderInfo) {
return null;
}
}
이렇게 쓴다면? 구현체에서도 해당 동일하게 제네릭 타입으로 구현할 수 있다.
만약에 Response타입에 대한 제약을 더 두고싶다면
public class AOrderInfaceImpl<T,R> implements OrderInterface<T,R>{
@Override
public <T extends ResOrder> T updateOrder(ReqOrder<R> orderInfo) {
return null;
}
@Override
public <T extends ResOrder> T createOrder(ReqOrder<R> orderInfo) {
return null;
}
}
이런식으로도 뭐 사용할 수 있다.
끗-
반응형