회원가입

13. [다형성] 교통 수단

NULL 2021-10-14

 실습과제

아래는 이전 노트에서 봤던 주행 시뮬레이터가 갖춰야 할 조건들이다.

  1. 여러 가지 교통 수단들(자전거, 일반 자동차, 스포츠카 등)을 가질 수 있다.
  2. 갖고 있는 교통 수단들의 주행을 동시에 시작/정지시킬 수 있다.
  3. 갖고 있는 교통 수단들의 현재 속도를 문자열 메시지로 볼 수 있다.

 

첫 번째 조건을 보니 주행 시뮬레이터를 만들려면 일단 각 교통 수단을 나타내는 클래스가 필요할 것 같다. 일단 첫 번째 조건에 제시된

  • 자전거
  • 일반 자동차
  • 스포츠카

를 나타낼 3가지 클래스를 만들어야 한다.

그런데 이 3가지 클래스에 다형성을 적용하고 싶다.

 

다형성을 적용하기 위해서는 추상 클래스가 필요하다.

이 3가지 클래스의 공통점을 묶어서 추상 클래스로 만들면 다형성을 적용할 수 있다.

 

3가지 클래스의 공통점은 뭘까? 바로 "교통 수단"이라는 점이다. "교통 수단"을 나타내는 추상 클래스를 만들면 된다.

Vehicle이라는 이름으로 추상 클래스를 만들어보겠다.

 

Vehicle 클래스는 어떤 메서드를 가져야할까?

주행 시뮬레이터가 갖춰야할 두 번째 조건과 세 번째 조건을 보면 알 수 있다.

 

과제를 풀기 위해 필요한 조건을 직접 설명하면,

  • 주행 시작 메서드(start) -> 추상 메서드로 정의하라
  • 주행 정지 메서드(stop) -> 일반 메서드로 정의하라
  • 자식 클래스가 속도를 나타내는 변수 _speed를 갖도록 유도하는 추상 getter 메서드(speed)

 

지금 메서드 이름을 괄호 안에 제시해두었다.

괄호 안에 있는 이름으로 Vehicle 추상 클래스메서드를 정의하라.

 

결국 Vehicle 클래스를 기준으로 다형성을 적용하려면,

  1. Vehicle 추상 클래스를 만들고
  2. 실제 교통 수단을 나타내는 3가지 일반 클래스(자전거, 일반 자동차, 스포츠카)가 Vehicle 클래스를 상속받은 후, 추상 메서드를 오버라이딩하면 된다.

 

일단 이번 과제에서는 Vehicle 추상 클래스만 만들어보자.

 

이때, 주행 정지 메서드(stop)는 추상 메소드가 아니라 구현 내용이 있는 일반 메서드로로 정의해보라

stop 메서드는 변수 _speed의 값을 0으로 설정하는 내용을 가지면 된다.

 


from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def start(self):
        """추상 메소드 start: 교통 수단의 주행을 시작한다"""
        pass

    @property
    @abstractmethod
    def speed(self):
        """변수 _speed(교통 수단의 속도)에 대한 추상 getter 메소드"""
        pass

    def stop(self):
        """일반 메소드 stop: 교통 수단의 속도를 0으로 바꾼다"""
        self.speed = 0
0 0