파이썬 클래스 예제를 하나씩 해석해보고 파이썬에서 객체 지향 프로그래밍(Object-Oriented Programming, OOP)이 어떻게 코드로 구현되는지 알아보도록 하겠다.
아래 예시 코드에서 2개의 축구팀과 축구팀 선수들의 정보를 전체 코드로 짜보았다.
class Player:
def __init__(self, name, team):
self.name = name
self.xp = 1500
self.team = team
def introduce(self):
print(f"Hello, my name is {self.name} and I play for {self.team}")
class Team:
def __init__(self, team_name):
self.team_name = team_name
self.players = []
def show_players(self):
for player in self.players:
player.introduce()
def add_player(self, player_name):
new_player = Player(player_name, self.team_name)
self.players.append(new_player)
def remove_player(self, player_name):
for player in self.players:
if player.name == player_name:
self.players.remove(player)
break
def sum_xp(self):
total_xp = sum(player.xp for player in self.players)
return total_xp
team_x = Team("Team X")
team_x.add_player("nico")
team_x.add_player("jaeyu")
team_x.add_player("Jason")
team_blue = Team("Team Blue")
team_blue.add_player("lynn")
team_x.remove_player("nico")
team_blue.show_players()
team_x.show_players()
print("Total XP in team_x:", team_x.sum_xp())
print("Total XP in Team Blue:", team_blue.sum_xp())
시작하기 전에 알아보는 파이썬 개념
이 예제에는 다양한 파이썬의 기본 개념이 포함되어 있다. 하나씩 살펴보자.
1. 클래스와 객체
- 클래스: 클래스는 한 객체가 가지고 있는 특징들을 꾸러미로 모아놓은 박스와 같다. (Class player, Class team)
- 객체: 객체는 클래스의 인스턴스이다. team_x와 team_blue는 Team 클래스의 객체이다.
2. 생성자 메서드
- __init__ 메서드: 생성자 메서드는 객체가 생성될 때 호출되며, 객체의 초기 상태를 설정한다.
3. 인스턴스 변수
- 인스턴스 변수: 객체의 속성이다. self.name, self.xp, self.team은 Player 클래스의 인스턴스 변수이고, self.team_name, self.players는 Team 클래스의 인스턴스 변수이다.
4. 메서드
- 메서드: 클래스 내에 정의된 함수이다. introduce, show_players, add_player, remove_player, sum_xp는 모두 메서드이다.
5. 리스트
- 리스트: 여러 값을 저장할 수 있는 데이터 구조이다." self.players[]"는 플레이어 객체를 저장하기 위한 리스트이다.
7. 문자열 포매팅
- f-string: 문자열 내에 변수의 값을 포함시킬 때 흔히 사용한다. (f"Hello, my name is {self.name} and I play for {self.team}").
8. 함수 호출
- 함수 호출은 함수나 메서드의 실행버튼을 누르는 것과 같은 개념으로 생각하면 이해하기 쉽다. introduce(), show_players(), add_player(), remove_player(), sum_xp()는 모두 함수 호출이다.
9. 상속
- 파이썬에서는 클래스를 상속을 통해 부모 클래스의 메서드를 자식 클래스에서 사용할 수 있다. 즉, 메서드가 여러 클래스에 정의되어 있는 경우, 가장 먼저 발견된 메서드가 호출되는데, 이러한 로직 덕분에 다중 상속같은 복잡한 상황에서도 어떤 메서드가 호출될지 예측할 수 있다.
코드 분해해서 알아보기
1. 전체적인 경기 정보를 가지고 있는 Player 클래스 생성
class Player:
def __init__(self, name, team):
self.name = name
self.xp = 1500
self.team = team
- Player라는 이름의 첫번째 클래스를 정의한다. 이 클래스는 모든 메서드에 적용될 수 있는 부모 클래스이다. __init__(self, name, team): 클래스의 생성자 메서드로, 객체가 생성될 때 자동으로 호출된다. self는 객체 자신, 즉 Player 클래스 안에 있는 인스턴스 그 자체를 가리킨다.
- self.name = name: 플레이어의 이름을 저장한다.
- self.xp = 1500: 경험치를 1500으로 초기화한다.
- self.team = team: 플레이어의 팀을 저장한다.
2. 선수들을 소개하는 introduce 메서드 생성
def introduce(self):
print(f"Hello, my name is {self.name} and I play for {self.team}")
- Player 클래스 내부에 introduce 메서드를 생성하였다. 모든 메서드가 introduce 메서드에 접근할 수 있다.
- print(f"Hello, my name is {self.name} and I play for {self.team}"): 플레이어의 이름과 팀을 출력한다.
3. 팀별 정보를 담은 Team 클래스 생성
class Team:
def __init__(self, team_name):
self.team_name = team_name
self.players = []
- class Team: Team이라는 이름의 클래스를 정의한다.
- __init__(self, team_name): 생성자 메서드로 팀 이름을 초기화한다.
- self.team_name = team_name: 팀의 이름을 저장한다.
- self.players = []: 플레이어를 저장할 리스트를 초기화한다.
def show_players(self):
for player in self.players:
player.introduce()
- show_players(self): 팀의 모든 플레이어를 소개하는 메서드이다.
- for player in self.players: self.players 리스트에 있는 각 플레이어에 대해 반복한다.
- player.introduce(): 각 플레이어의 introduce 메서드를 호출하여 소개한다.
def add_player(self, player_name):
new_player = Player(player_name, self.team_name)
self.players.append(new_player)
- add_player(self, player_name): 팀에 새로운 플레이어를 추가하는 메서드이다.
- new_player = Player(player_name, self.team_name): 새로운 플레이어 객체를 생성한다.
- self.players.append(new_player): 생성된 플레이어 객체를 self.players 리스트에 추가한다.
def remove_player(self, player_name):
for player in self.players:
if player.name == player_name:
self.players.remove(player)
break
- remove_player(self, player_name): 팀에서 플레이어를 제거하는 메서드이다.
- for player in self.players: self.players 리스트에 있는 각 플레이어에 대해 반복한다.
- if player.name == player_name: 플레이어의 이름이 주어진 이름과 같다면
- self.players.remove(player): 해당 플레이어를 리스트에서 제거한다.
- break: 플레이어를 찾았으므로 반복을 중단한다.
def sum_xp(self):
total_xp = sum(player.xp for player in self.players)
return total_xp
- sum_xp(self): 팀의 총 경험치를 계산하는 메서드이다.
- total_xp = sum(player.xp for player in self.players): 모든 플레이어의 경험치를 합산한다.
- return total_xp: 계산된 총 경험치를 반환한다.
3. 객체 생성 및 메서드 호출
team_x = Team("Team X")
team_x.add_player("nico")
team_x.add_player("jaeyu")
team_x.add_player("Jason")
team_blue = Team("Team Blue")
team_blue.add_player("lynn")
team_x.remove_player("nico")
team_blue.show_players()
team_x.show_players()
print("Total XP in team_x:", team_x.sum_xp())
print("Total XP in Team Blue:", team_blue.sum_xp())
- team_x = Team("Team X"): "Team X"라는 이름의 팀 객체를 생성한다.
- team_x.add_player("nico"): "nico"라는 이름의 플레이어를 팀에 추가한다.
- team_x.add_player("jaeyu"): "jaeyu"라는 이름의 플레이어를 팀에 추가한다.
- team_x.add_player("Jason"): "Jason"이라는 이름의 플레이어를 팀에 추가한다.
- team_blue = Team("Team Blue"): "Team Blue"라는 이름의 팀 객체를 생성한다.
- team_blue.add_player("lynn"): "lynn"이라는 이름의 플레이어를 팀에 추가한다.
- team_x.remove_player("nico"): "nico"라는 이름의 플레이어를 팀에서 제거한다.
- team_blue.show_players(): "Team Blue"의 모든 플레이어를 소개한다.
- team_x.show_players(): "Team X"의 모든 플레이어를 소개한다.
- print("Total XP in team_x:", team_x.sum_xp()): "Team X"의 총 경험치를 출력한다.
- print("Total XP in Team Blue:", team_blue.sum_xp()): "Team Blue"의 총 경험치를 출력한다.
'파이썬' 카테고리의 다른 글
파이썬으로 브라우저 조작하기 (Playwright) (0) | 2024.06.18 |
---|---|
파이썬 상속 (Inheritance) (0) | 2024.06.11 |
파이썬 Methods (1) | 2024.06.08 |
파이썬의 str 메서드 (__str__) (0) | 2024.06.08 |
파이썬 클래스 이해하기 (2) | 2024.06.08 |