제네릭의 효용
public class Generic {
public String plusReturnFunction(int a, int b) { ... }
public String plusReturnFunction(int a, long b) { ... }
public String plusReturnFunction(int a, String b) { ... }
}
public class Generic {
public Object plusReturnFunction(Object a,Object b) { ... }
}
// 1.
public class Generic<T> {
// 2.
private T t;
// 3.
public T get() {
return this.t;
}
public void set(T t) {
this.t = t;
}
public static void main(String[] args) {
// 4.
Generic<String> stringGeneric = new Generic<>();
// 5.
stringGeneric.set("Hello World");
String tValueTurnOutWithString = stringGeneric.get();
System.out.println(tValueTurnOutWithString);
}
}
static T get() { ... } // 에러
static void set(T t) { ... } // 에러
2. 제네릭 배열을 생성 할 수 없다.
다수의 타입변수를 사용 할 수 있다.
public class Generic<T, U, E> {
public E multiTypeMethod(T t, U u) { ... }
}
Generic<Long, Integer, String> instance = new Generic();
instance.multiTypeMethod(longVal, intVal);
다형성 즉 상속과 타입의 관계는 그대로 적용된다.
a. 대표적으로 부모 클래스로 제네릭 타입변수를 지정하고, 그 안에 자식클래스를 넘기는 것은 잘 동작한다.
와일드 카드를 통해 제네릭의 제한을 구체적으로 정할 수 있다.
public class ParkingLot<T extends Car> { ... }
ParkingLot<BMW> bmwParkingLot = new ParkingLot();
ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!
메서드를 스코프로 제네릭을 별도로 선언 할 수 있다.
메서드 자체만으로도 제네릭으로 만들 수 있다.
public class Generic<T, U, E> {
// Generic<T,U,E> 의 T와 아래의 T는 이름만 같을뿐 다른 변수
// class 를 인스턴스화 할때 T는 예를 들어 String이면
// 메서드를 호출할 때 리턴타입 T는 다르게 할 수 있기 때문에 헷갈리지 않기
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
}
// StatusMessageDto<T>
@Data
@AllArgsConstructor(staticName = "add")
public class StatusMessageDto<T> {
private int statusCode;
private String message;
@JsonInclude(JsonInclude.Include.NON_NULL)
private T data;
public static <T> StatusMessageDto<T> setSuccess(int statusCode, String message, T data){
return StatusMessageDto.add(statusCode, message, data);
}
public static <T> StatusMessageDto<T> setFail(int statusCode, String message){
return StatusMessageDto.add(statusCode, message, null);
}
}
// BoardService
// 게시글 삭제
public ResponseEntity<StatusMessageDto> deleteBoard(BoardRequestDto.Delete deleteDto, HttpServletRequest request) {
User user = checktoken(request);
Board board = boardRepository.findByBoardIdAndUsername(deleteDto.getBoardId(), user.getUsername()).orElseThrow(
() -> new NoSuchElementException("본인의 글만 삭제할 수 있습니다.")
);
boardRepository.delete(board);
StatusMessageDto statusMessageDto = StatusMessageDto.setSuccess(StatusEnum.OK.getStatusCode(), "게시글 삭제 완료", *null*);
return new ResponseEntity(statusMessageDto, HttpStatus.OK);
}
package com.sparta.spring_lv1_assignment.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class StatusMessageDto<T> {
private int statusCode;
private String message;
@JsonInclude(JsonInclude.Include.NON_NULL)
private T data;
public static <T> StatusMessageDto<T> setSuccess(int statusCode, String message, T data){
return new StatusMessageDto<>(statusCode, message, data);
}
public static <T> StatusMessageDto<T> setFail(int statusCode, String message){
return new StatusMessageDto<>(statusCode, message, null);
}
}