DevBoi

[Java] 제네릭을 조금 잘 써보면 어떨까 본문

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;
  }

}

이런식으로도 뭐 사용할 수 있다.

끗-

반응형