차량 대여 서비스
Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 64번째.
챌린지
중급이 챌린지에서는 차량 대여 시스템을 구현합니다. 이 시스템은 적절한 상속과 캡슐화를 사용하여 차량, 대여 및 대여 대행업체를 모델링합니다.
vehicle.py- 기본 Vehicle 클래스 구현car.py- Car 서브클래스 구현motorcycle.py- Motorcycle 서브클래스 구현rental.py- Rental 클래스 구현rentalagency.py- RentalAgency 클래스 구현
각 파일에는 구현을 안내하는 상세한 TODO 주석이 포함되어 있습니다. 이 주석들을 따라 코드가 모든 요구 사항을 충족하도록 작성하세요.
치트 시트
이 챌린지는 상속과 캡슐화를 포함한 객체 지향 프로그래밍 원칙을 사용하여 차량 대여 시스템을 구현하는 데 중점을 둡니다. 이 시스템은 전체 대여 비즈니스를 모델링하기 위해 함께 작동하는 여러 클래스로 구성됩니다.
구현에는 다음을 생성하는 작업이 포함됩니다:
- 공통 속성과 메서드를 가진 기본
Vehicle클래스 - Vehicle을 상속받는
Car및Motorcycle서브클래스 - 개별 대여 트랜잭션을 관리하는
Rental클래스 - 전체 대여 시스템을 조정하는
RentalAgency클래스
직접 해보기
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from rental import Rental
from rentalagency import RentalAgency
# 종합 테스트 케이스 처리기
test_case = input()
if test_case == "create_vehicles":
# 차량 생성 테스트
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
print(car)
print(bike)
elif test_case == "rental_workflow":
# 대여 워크플로우 테스트
agency = RentalAgency("Quick Rentals")
# 차량 추가
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
agency.add_vehicle(car)
agency.add_vehicle(bike)
# 대여 가능한 차량 확인
print(f"Available before rental: {len(agency.available_vehicles())}")
# 차량 대여
rental_id = agency.rent_vehicle("C123", "John Doe", 3)
print(f"Rental created: {rental_id}")
# 대여 후 대여 가능한 차량 확인
print(f"Available after rental: {len(agency.available_vehicles())}")
# 차량 반납
agency.return_vehicle(rental_id)
# 반납 후 대여 가능한 차량 확인
print(f"Available after return: {len(agency.available_vehicles())}")
elif test_case == "rental_cost":
# 대여 비용 계산 테스트
car = Car("C123", "Toyota", "Camry", 50, 5)
rental = Rental("R1", car, "John Doe", 3)
print(f"Rental cost for 3 days: ${rental.calculate_cost()}")
elif test_case == "vehicle_methods":
# Vehicle 메서드 테스트
vehicle = Vehicle("V789", "Generic", "Vehicle", 25)
print(vehicle)
print(f"Start rental: {vehicle.start_rental()}")
print(f"Start rental again: {vehicle.start_rental()}")
print(f"End rental: {vehicle.end_rental()}")
print(f"Start rental after end: {vehicle.start_rental()}")
elif test_case == "inheritance_check":
# 상속 관계 테스트
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
print(f"Car is a Vehicle: {isinstance(car, Vehicle)}")
print(f"Motorcycle is a Vehicle: {isinstance(bike, Vehicle)}")
print(f"Car is a Motorcycle: {isinstance(car, Motorcycle)}")
elif test_case == "polymorphism":
# 다형성 동작 테스트
vehicles = [
Vehicle("V789", "Generic", "Vehicle", 25),
Car("C123", "Toyota", "Camry", 50, 5),
Motorcycle("M456", "Honda", "CBR", 35, 600)
]
for i, v in enumerate(vehicles):
print(f"Vehicle {i+1}: {v}")
elif test_case == "rental_edge_cases":
# 대여 예외 상황 테스트
agency = RentalAgency("Edge Rentals")
# 존재하지 않는 차량 대여 시도
print(f"Rent non-existent: {agency.rent_vehicle('X999', 'John Doe', 3)}")
# 차량 추가 및 대여
car = Car("C123", "Toyota", "Camry", 50, 5)
agency.add_vehicle(car)
rental_id = agency.rent_vehicle("C123", "John Doe", 3)
print(f"Valid rental: {rental_id}")
# 동일한 차량 중복 대여 시도
print(f"Rent unavailable car: {agency.rent_vehicle('C123', 'Jane Smith', 2)}")
# 존재하지 않는 대여 건 반납 시도
print(f"Return non-existent rental: {agency.return_vehicle('R999')}")
# 유효한 대여 건 반납
print(f"Return valid rental: {agency.return_vehicle(rental_id)}")
# 이미 완료된 대여 건 다시 반납 시도
print(f"Return completed rental: {agency.return_vehicle(rental_id)}")
elif test_case == "agency_operations":
# 종합적인 대행사 운영 테스트
agency = RentalAgency("Full Service Rentals")
# 차량 5대 추가
vehicles = [
Car("C1", "Toyota", "Camry", 50, 5),
Car("C2", "Honda", "Accord", 55, 5),
Car("C3", "Ford", "Focus", 45, 5),
Motorcycle("M1", "Honda", "CBR", 35, 600),
Motorcycle("M2", "Yamaha", "R1", 40, 1000)
]
for v in vehicles:
agency.add_vehicle(v)
print(f"Available vehicles: {len(agency.available_vehicles())}")
# 차량 3대 대여
rental_ids = [
agency.rent_vehicle("C1", "Customer 1", 3),
agency.rent_vehicle("C2", "Customer 2", 5),
agency.rent_vehicle("M1", "Customer 3", 2)
]
print(f"Available after rentals: {len(agency.available_vehicles())}")
# 차량 2대 반납
agency.return_vehicle(rental_ids[0])
agency.return_vehicle(rental_ids[1])
print(f"Available after returns: {len(agency.available_vehicles())}")
# 대여 가능한 차량 출력
print("Available vehicles:")
for v in agency.available_vehicles():
print(f" {v}")
elif test_case == "stress_test":
# 많은 차량을 이용한 부하 테스트
agency = RentalAgency("Stress Test Rentals")
# 차량 100대 추가
for i in range(100):
if i % 2 == 0:
vehicle = Car(f"C{i}", "Make{i}", f"Model{i}", 50, 5)
else:
vehicle = Motorcycle(f"M{i}", "Make{i}", f"Model{i}", 35, 600)
agency.add_vehicle(vehicle)
# 차량 50대 대여
rental_ids = []
for i in range(50):
vin = f"C{i*2}" if i % 2 == 0 else f"M{i*2-1}"
rental_id = agency.rent_vehicle(vin, f"Customer{i}", 3)
rental_ids.append(rental_id)
print(f"Available after 50 rentals: {len(agency.available_vehicles())}")
# 모든 대여 건 반납
for rental_id in rental_ids:
agency.return_vehicle(rental_id)
print(f"Available after all returns: {len(agency.available_vehicles())}")
elif test_case == "invalid_inputs":
# 잘못된 입력값 테스트
car = Car("C123", "Toyota", "Camry", -50, 5)
print(f"Car with negative rate: {car}")
bike = Motorcycle("M456", "Honda", "CBR", 35, 0)
print(f"Motorcycle with zero engine: {bike}")
rental_zero = Rental("R1", car, "John Doe", 0)
print(f"Rental with zero days cost: ${rental_zero.calculate_cost()}")
rental_neg = Rental("R2", car, "Jane Smith", -3)
print(f"Rental with negative days cost: ${rental_neg.calculate_cost()}")