Free Lines Arrow
본문 바로가기
Language/Java

[Java] Generic 와일드 카드

by skahn1215 2022. 6. 25.
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

댓글