반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- K8S
- Flutter
- 스프링부트공부
- 알고리즘공부
- 스프링부트
- JPA공부
- querydsl
- 플러터 공부
- 플러터 개발
- 스프링공부
- 스프링 공부
- 코테공부
- nestjs
- 카프카
- 기술공부
- 프로그래머스
- 자바공부
- JPA
- 스프링
- JPA스터디
- JPA예제
- JPA 공부
- Axon framework
- nestjs공부
- Kafka
- nestjs스터디
- DDD
- 자료구조공부
- 기술면접공부
- 코테준비
Archives
- Today
- Total
DevBoi
[Java] 제네릭을 조금 잘 써보면 어떨까 본문
반응형
제네릭을 좀 잘 써보자.
제네릭은 개인적인 생각으로는 인터페이스의 존재이유와 비슷하다고 생각한다.
타입이나 제약을두지 않고, 해당 상속받은 개체에서 자유롭게 짜는것을 의미한다.
예를 바로 들어보자
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;
}
}
이런식으로도 뭐 사용할 수 있다.
끗-
반응형
'Language > [Java]' 카테고리의 다른 글
[Java] mapMulti 사용 (0) | 2023.07.07 |
---|---|
[Java] static block 및 instance block (0) | 2023.06.26 |
[Java] Mapstruct Spring 적용하기 (0) | 2023.06.14 |
인텔리제이 Process finished with non-zero exit value 1 오류 (0) | 2023.06.11 |
[Java] Record class란? (0) | 2023.05.27 |