개발일지?/내배캠

캠프 8주 4일차 TIL

규파팡 2023. 5. 7. 17:34

오늘

OOP(Object Oriented Programming) 특강 이후로 이해여부를 확인하는 퀴즈와 과제가 주어졌다. 그러면서 오버라이딩(Overriding)과 오버로딩(Overloading)에 대해서 비교하는 문제를 만났다. 그래서 특강 때 나오지 않았다고 하여 구글링으로 오버로딩과 오버라이딩에 대해서 정리했다. 오버라이딩(Overriding)은 일단 내 기억에 있는 바로는 class내에 선언된 메서드를 자식 클래스에서 선언해서 내용을 변경해서사 용할 때 지칭하는 말이다. 

class Car():
    def __init__(self, model, color, speed):
        self.model = model
        self.color = color
        self.speed = speed

    def accelerate(self, accel):
        self.speed += accel

    def brake(self, brake_speed):
        self.speed -= brake_speed

    def get_speed(self):
        return self.speed


class Hyundai(Car):
    def __init__(self, model, color, speed):
        super().__init__(model, color, speed)

    def accelerate(self, accel):
        self.speed += accel*2

    def brake(self, brake_speed):
        self.speed -= brake_speed*2

얼마 전에 작업했던 OOP특강 과제로 예를 들면 class를 지정하고 아래에 현대에 차를 상속시킨다. 그리고 상속한 클래스에 메서드를 중복이름으로 지정해 주면 부모 class의 accelerate는 무시하고 아래에 accelerate의 *2를 적용해 주면 아래와 같이 출력된다.

오버라이딩(Overriding) 전

ca = Car("avante", "Silver", 100)
ca.accelerate(200)
ca.brake(100)
print(ca.model)
print(ca.color)
print(ca.speed)
# 상속전 accelerate와 brake
# 실행결과
>>>
    avante
    Silver
    200

오버라이딩(Overriding) 후

korea = Hyundai("sonata", "Black", 200)
korea.accelerate(200)
korea.brake(100)
print(korea.model)
print(korea.color)
print(korea.speed)
# 상속후 accelerate와 brake

>>> 실행결과
    sonata
    Black
    400

오버로딩(Overloading)은

상속 말고 동일 class 내에서 메서드명을 달리 해서 사용한다.

class Car():
    def __init__(self, model, color, speed):
        self.model = model
        self.color = color
        self.speed = speed

    def accelerate(self, accel):
        self.speed += accel

    def brake(self, brake_speed):
        self.speed -= brake_speed

    def brake(self, brake_speed, stop):
        self.speed -= brake_speed
        self.speed = 0

    def get_speed(self):
        return self.speed

위에 보면 brake 메서드가 2개다 다만 인자개수의 차이로 이름이 같지만 다른 메서드로 사용가능하다 자바를 배우지 않았지만 java는 다른 라이브러리를 사용하지 않아도 적용된다고 했는데 python은 오버로딩을 사용할 때 아래와 같은 오류가 난다. 

$ C:/Users/@@@/AppData/Local/Programs/Python/Python311/python.exe e:/sparta/test_co/.py
Traceback (most recent call last):
  File "e:\sparta\test_co\.py", line 34, in <module>
    ca.brake(100)
TypeError: Car.brake() missing 1 required positional argument: 'stop'

내가 알기론 아래메서드를 적용받는 데 내가 출력하는 인자가 1개라 필수인자 stop이 없다고 뜨는 것.

ca.brake(100)

그래서 , 인자를 작성해 주면 오류는 사라진다. 하지만 우리는 오버로딩(Overloading)을 알아보기 위한 거니깐.

오버로딩(Overloading)을 파이썬에서 사용할 수 있게 하려면 우선 라이브러리를 설치해주어야 한다. 우리가 사용할 라이브러리는 MultipleDispatch이다.

우선 설치를 해주자

pip install multipledispatch

이 라이브러리는 우리가 오버로딩할 때 인자값을 추가해 줄 수 있게 해 준다. 위처럼 오류가 나지 않고 

@dispatch(int)

@dispatch(int, int)

이런 식으로도 사용하고

@dispatch(str, int)

@dispatch(float, str, int) 동일 메서드이름에서 인자개수상관없이 

@dispatch(int, int)

@dispatch(float, int)으로 사용해도 가능하다.

각각의 타입을 작성해 주면 해당 타입으로 인자를 넣을 수 있게 해 준다. 

str : 문자열, int : 숫자열, float : 실수 등등 사용이 가능하다. 그 밖에도 진짜 많은 type사용이 가능하다(list, dict, tuple 등등 웬만한 건다 쓰는 거 같다. 궁금해서 검색했는데 너무 많이 쓰이길래 그냥 다 쓰나 보다 싶기도 하다.)

사용예시를 보면

from multipledispatch import dispatch


class Car():
    def __init__(self, model, color, speed):
        self.model = model
        self.color = color
        self.speed = speed

    def accelerate(self, accel):
        self.speed += accel

    @dispatch(int)
    def brake(self, brake_speed):
        self.speed -= brake_speed

    @dispatch(int, int)
    def brake(self, brake_speed, stop):
        self.speed -= brake_speed
        self.speed = 0

    def get_speed(self):
        return self.speed

위에서 라이브러리 설치를 해주고 import 해서 @dispatch(int, int) 적용해 주면 사용가능하다. 이제 

ca.brake(100, 0)

이렇게 작성해도 오류가 나지 않고 자동차의 현재속도가 0으로 감속하는 걸 볼 수 있다.

>>> 실행결과
    $ C:/Users/@@@/AppData/Local/Programs/Python/Python311/python.exe e:/sparta/test_co/.py
    avante
    Silver
    0

이렇게 오버로딩과 오버라이딩을 알아봤다. 두 개는 같은 느낌의 다른 기능이다. 오버라이딩은 자식 class에서 부모 class 메서드를 덮어씌우는 거고. 오버로딩은 동일 class에서 인자의 차이로 서로 달리값을 적용하는 방법이다.

 

오늘의 규파팡이 느낀 점!

갑자기 과제가 생겨서 공부했는데 꽤나 복잡? 하고 하나배운기분이다. 앞으로도 til을 작성할 때는 그날그날을 지나쳐 보내기 위함이 아니라 공부하는 생각으로 정리하고 작성해야겠다.

TIL 대표이미지

 

'개발일지? > 내배캠' 카테고리의 다른 글

캠프 9주 1일차 TIL  (1) 2023.05.08
WIL 8주차 - 내배캠  (0) 2023.05.07
캠프 8주 3일차 TIL  (0) 2023.05.03
WIL 7주차 - 내배캠  (0) 2023.04.30
캠프 7주 5일차 TIL  (0) 2023.04.28