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 메서드 (1) | 2022.06.25 | 
| [Java] Generic 제한 (0) | 2022.06.21 | 
| [Java] Generic 기초 (1) | 2022.06.11 | 
| [Java] String to LocalDateTime (0) | 2022.02.12 | 
 
		
	
                
                
                
                
                
                
                
                                                
                
                
                
 
										
									 
										
									
댓글