본문 바로가기

파이썬

파이썬 객체 프로그래밍

파이썬 클래스 예제를 하나씩 해석해보고 파이썬에서 객체 지향 프로그래밍(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