요즘은 가상으로 현실과 최대한 비슷한 환경에서 실험할 수 있게 해주는 시뮬레이터 프로그램이 많다.
이번 과제에서는 자동차를 마치 실제 도로에서 운전하는 것 같은 체험을 하게 해주는 주행 시뮬레이터를 만들어 볼 것이다.
본격적으로 주행 시뮬레이터를 만들기 전에 아래의 조건들을 만족하는 프로그램을 어떻게 객체 지향적으로 작성할 수 있을지 한번 고민하자.
주행 시뮬레이터는:
주행 시뮬레어터가 완성되면 어떻게 사용할 수 있을지 미리 테스트 코드를 보자
# 일반 자동차 인스턴스들
car_1 = NormalCar(0, 100)
car_2 = NormalCar(0, 120)
# 스포츠카 인스턴스들
sports_car_1 = SportsCar(0, 200)
sports_car_2 = SportsCar(0, 190)
# 자전거 인스턴스
bicycle = Bicycle(0)
# 주행 시뮬레이터 인스턴스
driving_simulator = DrivingSimulator()
# 주행 가능 인스턴스들을 주행 시뮬레이터에 추가한다
driving_simulator.add_vehicle(car_1)
driving_simulator.add_vehicle(car_2)
driving_simulator.add_vehicle(sports_car_1)
driving_simulator.add_vehicle(sports_car_2)
driving_simulator.add_vehicle(bicycle)
driving_simulator.add_vehicle(1)
# 시뮬레이터 내 모든 인스턴스들을 주행 시작시킨다
driving_simulator.start_all_vehicles()
print(driving_simulator)
# 시뮬레이터 내 모든 인스턴스들의 주행 정지시킨다
driving_simulator.stop_all_vehicles()
print(driving_simulator)
1은 교통 수단이 아니기 때문에 추가할 수 없습니다
모든 교통 수단을 주행 시작시킵니다!
일반 차량 시동겁니다.
일반 차량 시동겁니다.
스포츠카 시동겁니다.
스포츠카 시동겁니다.
자전거 페달 돌리기 시작합니다.
이 일반 차량은 현재 50.0km/h로 주행 중입니다.
이 일반 차량은 현재 60.0km/h로 주행 중입니다.
이 스포츠카는 현재 200km/h로 주행 중입니다.
이 스포츠카는 현재 190km/h로 주행 중입니다.
이 자전거는 현재 5.0km/h로 주행 중입니다.
모든 교통 수단을 주행 정지시킵니다!
이 일반 차량은 현재 0km/h로 주행 중입니다.
이 일반 차량은 현재 0km/h로 주행 중입니다.
이 스포츠카는 현재 0km/h로 주행 중입니다.
이 스포츠카는 현재 0km/h로 주행 중입니다.
이 자전거는 현재 0km/h로 주행 중입니다.
from abc import ABC, abstractmethod
class Vehicle(ABC):
@abstractmethod
def start(self):
pass
@abstractmethod
def stop(self):
pass
class NormalCar(Vehicle):
name = "일반 차량"
def __init__(self, stop_speed, current_speed):
self._current_speed = stop_speed
self.stop_speed = stop_speed
self.max_speed = current_speed / 2
def start(self):
self._current_speed = self.max_speed
print(f"{self.name} 시동겁니다.")
def stop(self):
self._current_speed = self.stop_speed
def __str__(self):
return f"이 {self.name}은 현재 {self._current_speed}km/h로 주행 중입니다."
class SportsCar(Vehicle):
name = "스포츠카"
def __init__(self, stop_speed, current_speed):
self._current_speed = stop_speed
self.stop_speed = stop_speed
self.max_speed = current_speed
def start(self):
self._current_speed = self.max_speed
print(f"{self.name} 시동겁니다.")
def stop(self):
self._current_speed = self.stop_speed
def __str__(self):
return f"이 {self.name}은 현재 {self._current_speed}km/h로 주행 중입니다."
class Bicycle(Vehicle):
name = "자전거"
def __init__(self, stop_speed):
self._current_speed = stop_speed
self.stop_speed = stop_speed
self.max_speed = 5.0
def start(self):
self._current_speed = self.max_speed
print(f"{self.name} 페달 돌리기 시작합니다.")
def stop(self):
self._current_speed = self.stop_speed
def __str__(self):
return f"이 {self.name}은 현재 {self._current_speed}km/h로 주행 중입니다."
class DrivingSimulator:
def __init__(self):
self.vehicle_set = []
def add_vehicle(self, vehicle: Vehicle):
if isinstance(vehicle, Vehicle):
self.vehicle_set.append(vehicle)
else:
print(f'{vehicle}은 교통 수단이 아니기 때문에 추가할 수 없습니다')
def start_all_vehicles(self):
print("모든 교통 수단을 주행 시작시킵니다!\\n")
for vehicle in self.vehicle_set:
vehicle.start()
def stop_all_vehicles(self):
print("모든 교통 수단을 주행 정지시킵니다!\\n")
for vehicle in self.vehicle_set:
vehicle.stop()
def __str__(self):
for vehicle in self.vehicle_set:
print(vehicle)
return ""
# 일반 자동차 인스턴스들
car_1 = NormalCar(0, 100)
car_2 = NormalCar(0, 120)
# 스포츠카 인스턴스들
sports_car_1 = SportsCar(0, 200)
sports_car_2 = SportsCar(0, 190)
# 자전거 인스턴스
bicycle = Bicycle(0)
# 주행 시뮬레이터 인스턴스
driving_simulator = DrivingSimulator()
# 주행 가능 인스턴스들을 주행 시뮬레이터에 추가한다
driving_simulator.add_vehicle(car_1)
driving_simulator.add_vehicle(car_2)
driving_simulator.add_vehicle(sports_car_1)
driving_simulator.add_vehicle(sports_car_2)
driving_simulator.add_vehicle(bicycle)
driving_simulator.add_vehicle(1)
# 시뮬레이터 내 모든 인스턴스들을 주행 시작시킨다
driving_simulator.start_all_vehicles()
print(driving_simulator)
# 시뮬레이터 내 모든 인스턴스들의 주행 정지시킨다
driving_simulator.stop_all_vehicles()
print(driving_simulator)