다형성이란?
다형성(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은 로봇의 "작동 버튼"이라고 할 수 있다.
'AI Journey > 혼자 공부하는 파이썬' 카테고리의 다른 글
[파이썬] OOP - 캡슐화 개념과 데이터 은닉, getter/setter 이해하기 (0) | 2025.04.10 |
---|---|
[파이썬] os 모듈, 언제 어떻게 쓰면 좋을까? (0) | 2025.03.21 |
[파이썬] 슬라이싱 기본 규칙 - 문자열, 튜플, 리스트 (0) | 2025.03.05 |
[파이썬] 딕셔너리 - 딕셔너리 내용을 삭제하는 메서드 (0) | 2025.02.21 |
[파이썬] 리스트 - 리스트 내용을 삭제하는 메서드 .remove(), .pop(), clear() 비교 (0) | 2025.02.21 |