본문 바로가기
AI Journey/혼자 공부하는 파이썬

[파이썬] 다형성(Polymorphism) Part 1. 개념 이해하기 (feat. 우주청소로봇)

by 보눔비스타 2025. 3. 7.

다형성이란? 

다형성(polymorphism)이란 "같은 이름을 가진 기능이 상황에 따라 다르게 동작함"을 의미한다. 비유를 해 보면, 똑같은 단어 "먹다"도 상황에 따라 다르게 쓰인다. "밥을 먹다"일수도 있고, "빵을 먹다"일수도 있다. 

 

마찬가지로 파이썬에서 다형성은 객체지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나로, 이 개념을 코드로 구현한다. 예를 들어 같은 이름의 함수나 메서드를 쓰더라도 어떤 객체(object)를 다루느냐에 따라 결과가 달라질 수 있다. 

 

예를 들어, 우주에서 쓰레기를 수집하는 로봇이 있다고 가정해 보자. 

 

"진공 로봇"은 우주 먼지를 빨아들여 블랙홀 에너지로 바꾼다. 

"분쇄 로봇"은 고철 조각을 나노 입자로 분쇄해 우주로 뿌린다. 

"재활용 로봇"은 쓰레기를 수거해 새 위성 부품으로 만든다. 

 

이걸 파이썬 코드로 다음과 같이 작성해볼 수 있다. 

class VacuumBot:  # 진공 로봇
    def process_trash(self):
        print("우주 먼지를 빨아들여 블랙홀 에너지로 변환합니다.")

class ShredderBot:  # 분쇄 로봇
    def process_trash(self):
        print("고철 조각을 나노 입자로 분쇄해 우주로 뿌립니다.")

class RecyclerBot:  # 재활용 로봇
    def process_trash(self):
        print("플라스틱 쓰레기를 수거해 3D 프린터로 새 위성 부품을 뽑아냅니다.")

# 쓰레기 처리 명령
def clean_up(robot):
    robot.process_trash()

# 로봇들 준비
vacuum = VacuumBot()
shredder = ShredderBot()
recycler = RecyclerBot()

# 같은 명령, 다른 처리
clean_up(vacuum)    # 출력: 우주 먼지를 빨아들여 블랙홀 에너지로 변환합니다.
clean_up(shredder)  # 출력: 고철 조각을 나노 입자로 분쇄해 우주로 뿌립니다.
clean_up(recycler)  # 출력: 플라스틱 쓰레기를 수거해 3D 프린터로 새 위성 부품을 뽑아냅니다.

 

위 프로그램이 동작하는 순서대로 살펴보면, 

 

1. 클래스 정의하기 

먼저, 세 개의 로봇 VacuumBot, ShredddrBot, RecyclerBot에 대한 클래스를 정의한다. 

process_trash(self) 메서드: 각각의 로봇이 우주 쓰레기를 처리하는 방식.

**self는 클래스로 만든 객체(인스턴스)가 자기 자신을 가리킬 때 사용. 파이썬에서는 메서드를 정의할 때 첫 번재 매개변수로 self를 꼭 넣어줘야 하는데, 그렇게 해야 객체가 자기 속성이나 다른 메서드에 접근할 수 있다.**

 

2. 함수 정의

clean_up 이라는 함수를 정의한다. 이 함수는 로봇 객체를 받아서 쓰레기를 처리하게 하는 함수다. 

robot 매개변수: 어떤 로봇이든 받아올 수 있는 자리표시자(placeholder)

robot.process_trash() : 전달받은 로봇의 process_trash 메서드를 호출한다. 어떤 로봇이 오느냐에 따라 다른 결과가 나온다. (다형성)

이 함수를 호출하는 것은 "로봇아, 쓰레기를 처리해!"라는 명령을 하는 것과 같다. 

 

3. 객체 생성

각 클래스에서 객체(인스턴스)를 생성한다.

vacuum = VacuumBot() : (진공 로봇)  VacuumBot 클래스의 객체를 만들어 vacuum 변수에 저장.

shredder = ShredderBot() : (분쇄 로봇)  SheredderBot 클래스의 객체를 만들어 shredder 변수에 저장.

recycler = RecyclerBot() : (재활용 로봇)  RecyclerBot 클래스의 객체를 만들어 recycler에 저장. 

 

이렇게 해서 각 로봇은 자기만의 process_trash 동작을 갖게 된다.

 

4. 함수 호출

clean_up 함수를 호출하면서 각 로봇 객체를 전달한다.

 

clean_up(vacuum) : robot 매개변수에 vacuum 객체가 들어감.
robot.process_trash()가 호출되며, VacuumBot의 process_trash가 실행.
출력: "우주 먼지를 빨아들여 블랙홀 에너지로 변환합니다."

 

clean_up(shredder) : robot에 shredder 객체가 들어감.
ShredderBot의 process_trash가 실행.
출력: "고철 조각을 나노 입자로 분쇄해 우주로 뿌립니다."

 

clean_up(recycler) : robot에 recycler 객체가 들어감.
RecyclerBot의 process_trash가 실행.
출력: "플라스틱 쓰레기를 수거해 3D 프린터로 새 위성 부품을 뽑아냅니다."

 

요약하면 :

클래스 정의: 세 가지 로봇(VacuumBot, ShredderBot, RecyclerBot)의 설계도를 만듦. 각자 process_trash라는 메서드로 쓰레기 처리 방식을 정의.
함수 정의: clean_up 함수를 만들어 로봇에게 "쓰레기 처리해!"라고 명령할 준비.
객체 생성: 설계도를 바탕으로 실제 로봇 객체(vacuum, shredder, recycler)를 만듦.
함수 호출: 각 로봇을 clean_up에 넣어 쓰레기를 처리하게 함. 로봇마다 다른 방식으로 처리. (다형성)

 

결론적으로 비유를 하자면 클래스는 로봇의 "설계도", 객체는 설계도에 따라 만들어진 "로봇", clean_up은 로봇의 "작동 버튼"이라고 할 수 있다.