자바

[OOP 트레이닝] 주차장 시스템 - (2)

menuhwang 2023. 6. 29. 11:23

시리즈

주차장 입차 정보 저장

이번에는 입차 시 차량 정보를 저장해 두는 기능을 구현해 보자.

 

차량 정보는 차량번호를 뜻하는 id를 저장하기로 한다.

 

그리고 같은 번호를 가진 차량은 존재하지 않고, 입차 내역에 같은 차량이 중복되는 것을 방지하도록 한다.

 

Car

차량 정보를 담을 Car 객체를 생성했다.

 

차량 정보를 담는 id 필드가 있고, id가 같으면 같은 인스턴스로 판단하기 위해 equals와 hashCode를 오버라이딩했다.

 

public class Car {
    private final String id;

    public Car(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return String.format("[Car] 차량번호:%s", id);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Car car = (Car) o;
        return id.equals(car.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

 

Parking

입차 내역을 담기 위한 Set<Car> cars 필드를 만들었다.

 

그리고 입출차 로직을 변경했다.

 

입차 시 중복 확인을 하고 중복되면 로직을 끝내도록 했다.

(지금은 Set 타입이라 불필요하지만, 나중을 위해...!)

 

중복되지 않으면 cars에 추가!

 

출차 시에는 cars 목록에서 제거하도록 수정했다.

 

+ 현재 주차 차량 목록을 확인하기 위한 함수도 작성했다.

 

public class Parking {
    private final Set<Car> cars = new HashSet<>();

    public void in(Car car) {
        // 차량 번호가 같은 경우 무반응
        if (cars.contains(car)) return;
        System.out.printf("입차 %s\n", car);
        cars.add(car);
    }

    public void out(Car car) {
        System.out.printf("출차 %s\n", car);
        cars.remove(car);
    }

    public void printInfo() {
        System.out.println("==========================================================");
        System.out.printf("[%s] 현재 주차 상황 %d대\n", LocalDateTime.now(), cars.size());
        for (Car car : cars) {
            System.out.println(car);
        }
        System.out.println("==========================================================");
    }
}

 

Main

이제 만든 객체들로 주차장을 운영해 보자.

 

public class Main {
    public static void main(String[] args) {
        Parking parking = new Parking(); // 주차장 개업
        Car car1 = new Car("11차 0000"); // 차량 등록
        Car duplicated = new Car("11차 0000"); // 중복 확인을 위함
        Car car2 = new Car("20차 1000"); // 차량 등록
        Car car3 = new Car("00차 1200"); // 차량 등록

        parking.printInfo(); // 초기 주차장 상황 확인

        parking.in(car1); // car1 입차
        parking.in(duplicated); // car1 중복 객체 입차
        parking.printInfo(); // 주차장 확인

        parking.in(car2); // car2 입차
        parking.in(car3); // car3 입차
        parking.printInfo(); // 주차장 확인

        parking.out(car1); // car1 출차
        parking.printInfo(); // 주차장 확인
    }
}

 

 

!! 무료 주차장에서 유료 주차장으로 전환하기로 했다.

다음에는 요금 정산 시스템을 구현해 보도록 한다.

 

github : https://github.com/menuhwang/oop-training