728x90
반응형
Generic 와일드 카드
- 앞서 제한자를 알아봤다
- 이제 제한자의 한계점을 알아보고 그에 와일드 카드를 사용하여 이점을 해결해본다.
Generic 와일드 카드 의 구조
<? extends T> 와일드 카드의 상한 제한. T 와 그의 자식들만 가능하다.
<? super T> 와일드 카드의 하한 제한. T 와 그의 부모들만 가능하다.
<?> 모든 타입이 가능하다.
extends 의 제한 사항
- static 클래스에서 타입 매개변수 T 를 매개변수에 사용할수 없다.
- <T extends Class> 같은 경우는 해당 클래스만 받을수 있다.
public static void repair(VehicleContainer<Vehicle> vehicleContainer) {
log.info("container list size : {}", vehicleContainer.getSize());
List<Vehicle> vehicles = vehicleContainer.getVehicleList();
for(Vehicle vehicle : vehicles) {
log.info("{} 수리완료", vehicle.toString());
}
}
Vehicle vehicle1 = new Vehicle("base","vehicle1");
VehicleContainer<Vehicle> vehicleVehicleContainer = new VehicleContainer<>();
vehicleVehicleContainer.addVehicle(vehicle1);
RepairService.repair(vehicleVehicleContainer);
Car car1 = new Car("car1");
VehicleContainer<Car> carVehicleContainer = new VehicleContainer<>();
carVehicleContainer.addVehicle(car1);
RepairService.repair(carVehicleContainer); // 불가능하다 이유는 매개변수 타입이 이미 정해져 있기 때문
Generic 와일드 카드 예제
- 억지 스럽지만 다음 예제를 보겠습니다.
- VehicleRepairService 에서는 한대씩 밖에 수리를 못합니다.
- 그래서 컨테이너에 차량들을 담아 여러 차량을 한번에 수리할수 있는 서비스를 만들어 봅니다.
다이어 그램
- Vehicle 을 상속받아 Car, Boat 를 구현
- VehicleContainer: Car, Boat 를 여러개 담을수 있는 컨테이너
Vehicle
@Getter
@Setter
public class Vehicle {
private String type;
private String name;
private String status = "고장";
public Vehicle(String type, String name) {
this.type = type;
this.name = name;
}
public String toString() {
return "type: " + type + " name : " +name;
}
}
Boat
public class Boat extends Vehicle {
public Boat(String name) {
super("boat", name);
}
}
Car
public class Car extends Vehicle {
public Car(String name) {
super("car", name);
}
}
VehicleContainer
public class VehicleContainer<T extends Vehicle> {
List<T> vehicleList = new ArrayList<T>();
public void addVehicle(T t) {
vehicleList.add(t);
}
public int getSize() {
return vehicleList.size();
}
public List<T> getVehicleList() {
return vehicleList;
}
}
VehicleServiceCenter
- 여기가 중요하다 ? extends vehicleContainer 로 해주면 Vehicle 의 자식들은 다 들어올수 있다는 것이다.
@Slf4j
public class VehicleServiceCenter {
public static void repair(VehicleContainer<? extends Vehicle> vehicleContainer) {
log.info("container list size : {}", vehicleContainer.getSize());
for(Vehicle vehicle : vehicleContainer.getVehicleList()) {
log.info("{} 수리완료", vehicle.toString());
}
}
}
Test
VehicleContainer<Car> carVehicleContainer = new VehicleContainer<>();
VehicleContainer<Boat> boatVehicleContainer = new VehicleContainer<>();
VehicleServiceCenter.repair(vehicleVehicleContainer);
VehicleServiceCenter.repair(boatVehicleContainer);
예제코드
https://github.com/rnrl1215/java-exercise/tree/main/src/main/java/generic/wildcard
728x90
반응형
'Language > Java' 카테고리의 다른 글
[Java] SQL Mapper 만들기 (0) | 2022.10.20 |
---|---|
[Java] Generic 메서드 (0) | 2022.06.25 |
[Java] Generic 제한 (0) | 2022.06.21 |
[Java] Generic 기초 (0) | 2022.06.11 |
[Java] String to LocalDateTime (0) | 2022.02.12 |
댓글