Menu
Coddy logo textTech

차량 대여 서비스

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 110번째.

challenge icon

챌린지

쉬움

OOP 과정의 마지막 챌린지에 도달하신 것을 축하합니다! 지금까지 배운 추상 클래스, 상속, 캡슐화, State 패턴, Factory 패턴, 제네릭을 모두 활용하여 종합적인 Vehicle Rental Service를 구축해 보겠습니다.

여러분의 렌탈 서비스는 다양한 차량 유형을 관리하고, 가용 상태를 추적하며, 대여를 처리하고, 고객 기록을 유지 관리합니다. 이 시스템은 다음 7개의 파일로 구성됩니다:

  • vehicle_state.dart: 차량이 다양한 상태에서 어떻게 행동하는지 정의하는 VehicleState 추상 클래스를 생성하세요. 추상 메서드 String getStatus()bool canRent()를 포함하세요. 그런 다음 세 가지 구체적인 상태를 만듭니다:
    • AvailableState - Available을 반환하고 대여를 허용함
    • RentedState - Rented를 반환하고 대여를 허용하지 않음
    • MaintenanceState - In Maintenance를 반환하고 대여를 허용하지 않음
  • vehicle.dart: final id (String), final model (String), getter가 있는 private _dailyRate (double), 그리고 AvailableState로 초기화된 private _state (VehicleState)를 가진 추상 Vehicle 클래스를 생성하세요. 다음을 포함하세요:
    • 상태의 status를 반환하는 getter status
    • bool isAvailable() - 현재 상태가 대여를 허용하는지 확인
    • void setState(VehicleState state) - 차량의 상태를 변경
    • 추상 메서드 double calculateRentalCost(int days)
    • 추상 메서드 String getRequirements() - 특별한 요구 사항을 반환
    toString()을 오버라이드하여 [Type] model (id) - status 형식을 반환하도록 하세요. 여기서 Type은 런타임 타입입니다.
  • vehicles.dart: Vehicle을 상속받는 세 가지 차량 유형을 생성하세요:
    • Car - 표준 대여 비용은 일일 요금 곱하기 일수입니다. 요구 사항: Valid driver's license
    • Motorcycle - 대여 비용은 일일 요금 곱하기 일수에 10% 할인을 적용합니다. 요구 사항: Motorcycle license, Age 21+
    • Truck - 대여 비용은 일일 요금 곱하기 일수에 고정 수수료 $50를 더합니다. 요구 사항: Commercial license, Deposit required
  • vehicle_factory.dart: 타입(car, motorcycle, 또는 truck)에 따라 적절한 차량을 반환하는 정적 메서드 Vehicle create(String type, String id, String model, double dailyRate)를 가진 VehicleFactory 클래스를 생성하세요. 알 수 없는 타입의 경우 기본적으로 Car를 생성합니다.
  • customer.dart: id (String), name (String), 그리고 대여 기록의 private 리스트(String 리스트)를 가진 Customer 클래스를 생성하세요. 다음을 포함하세요:
    • addRental(String vehicleInfo) - 대여 기록 추가
    • getRentalCount() - 대여 횟수 반환
    • bool isEligible() - 고객의 활성 대여 건수가 3건 미만인 경우 true 반환
    toString()을 오버라이드하여 Customer: name (id) - X rentals 형식을 반환하도록 하세요.
  • rental_service.dart: 차량 함대를 위한 List<Vehicle>와 고객을 위한 List<Customer>를 가진 제네릭 기반의 RentalService 클래스를 생성하세요. 다음을 포함하세요:
    • addVehicle(Vehicle vehicle) - 함대에 추가하고, Added: vehicle.toString()을 출력
    • registerCustomer(Customer customer) - 고객 등록
    • rentVehicle(String customerId, String vehicleId, int days) - 고객이 존재하고, 자격이 있으며, 차량이 이용 가능한 경우: 차량 상태를 Rented로 변경하고, 고객에게 대여 기록을 추가하며, customerId rented vehicleId for X days. Cost: $Y (Y는 소수점 2자리까지 표시)를 출력합니다. 그렇지 않으면 적절한 메시지를 출력하세요: Customer not found, Customer not eligible, Vehicle not found, 또는 Vehicle not available
    • returnVehicle(String vehicleId) - 차량 상태를 Available로 설정하고, vehicleId returned를 출력
    • sendToMaintenance(String vehicleId) - 차량 상태를 Maintenance로 설정하고, vehicleId sent to maintenance를 출력
    • getAvailableVehicles() - 이용 가능한 차량 리스트를 반환
  • main.dart: 렌탈 서비스를 시연하세요. RentalService를 생성하고 팩토리를 사용하여 세 대의 차량을 추가합니다:
    • 자동차: V001, Toyota Camry, $45/day
    • 오토바이: V002, Honda CBR, $35/day
    • 트럭: V003, Ford F-150, $75/day
    고객(C001, Alice Johnson)을 등록하고 고객 정보를 출력하세요. 트럭의 요구 사항을 출력하세요. Alice에게 자동차를 3일 동안 대여하세요. 자동차를 다시 대여해 보세요(실패해야 함). 오토바이를 정비소로 보내세요. 이용 가능한 차량 대수를 Available vehicles: X 형식으로 출력하세요. 자동차를 반납하세요. 최종 이용 가능 대수를 출력하세요.

예상 출력:

Added: [Car] Toyota Camry (V001) - Available
Added: [Motorcycle] Honda CBR (V002) - Available
Added: [Truck] Ford F-150 (V003) - Available
Customer: Alice Johnson (C001) - 0 rentals
Commercial license, Deposit required
C001 rented V001 for 3 days. Cost: $135.00
Vehicle not available
V002 sent to maintenance
Available vehicles: 1
V001 returned
Available vehicles: 2

직접 해보기

import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';

void main() {
  // TODO: RentalService 인스턴스 생성
  
  // TODO: VehicleFactory를 사용하여 세 대의 차량을 생성하고 추가:
  // - Car: V001, Toyota Camry, $45/day
  // - Motorcycle: V002, Honda CBR, $35/day
  // - Truck: V003, Ford F-150, $75/day
  
  // TODO: 고객 등록 (C001, Alice Johnson)
  
  // TODO: 고객 정보 출력
  
  // TODO: 트럭의 요구 사항 출력 (트럭을 찾고 getRequirements() 호출)
  
  // TODO: Alice (C001)에게 자동차 (V001)를 3일 동안 대여
  
  // TODO: 자동차를 다시 대여 시도 (대여 불가능하므로 실패해야 함)
  
  // TODO: 오토바이 (V002)를 정비소로 보내기
  
  // TODO: 대여 가능한 차량 수를 'Available vehicles: X' 형식으로 출력
  
  // TODO: 자동차 (V001) 반납
  
  // TODO: 최종 대여 가능한 차량 수 출력
}

객체 지향 프로그래밍의 모든 레슨