코딩일기

[PYTHON 7] 객체지향 프로그래밍 {상속, 다중상속}(feat. Codestates _AI_BootCamp, 부트캠프) 본문

Code/기타

[PYTHON 7] 객체지향 프로그래밍 {상속, 다중상속}(feat. Codestates _AI_BootCamp, 부트캠프)

daje 2021. 3. 17. 13:45
728x90
반응형

 

 

 

m.blog.naver.com/shiva03/221565137478?view=img_1

 

 

 

 

안녕하십니까 다제입니다. 

 

오늘은 상속이라는 개념에 대해서 더욱 알아보도록 하겠습니다. 

 

상속에는 크게 단일 상속과 다중 상속으로 구분이 되는데요 

 

둘다 알아보는 시간을 갖도록 하겠습니다. 월활한 설명을 위해 제가 만든 게임 class를 가지고 설명 드리도록 하겠습니다. 

 

 


 

 

먼저, 아주 간단한 상속 코드를 보여드리겠습니다. 

우리가 골든리트리버를 만드는 객체지향 프로그램을 만든다고 해보겠습니다.

# 골든리트리버는 노란색인 경우가 많죠?
class GoldenR():
	color = "yellow"

class Dog():
	legs = 4
    eyes = 2 
    tail = 1
	color = "yellow"

# 위와 같이 코드를 쓸 수도 있지만, 한번 쓴 코드를 다시 쓰는 것은 낭비겠죠?
# 그래서 class Dog를 이렇게 수정할 수 있습니다. 

class Dog(GoldenR):
	legs = 4
    eyes = 2 
    tail = 1

# print(Dog.GolenR)을 치면 뒤에 나머지 속성들을 불러올 수 있습니다.

 

 

 


 

 

 

class Chapter:
  attack = 10

  def __init__(self, name, hp):
    self.name = name
    self.hp = hp
  
  def __str__(self):
    return f"{self.name} / {self.hp}"
  
class Assesin(Chapter):
  attack = 200
  def __init__(self, name, hp, cloking):
    super().__init__(name, hp)
    self.cloking = cloking
   

  def __str__(self):
    return f"name : {self.name}  \
    , hp : {self.hp} \
    , 은신시간 : {self.cloking}초 \
    , 공격력 : {self.attack}"

class tanker(Chapter):
  pass
minion = Chapter("미니언", 100)
zedo = Assesin("제드123", 400, 10)

print(zedo)

 

먼저 Chapter라는 class를 만들고, 자식 class로 assesin class를 하나 만들었습니다. 

 

Chapter는 일반적으로 생성되는 롤의 미니언을 생각하면서 만들었구요, zedo는 롤의 제드를 기반으로 해서 만들어보았습니다. 

 

앞 포스팅에서 오버라이딩에 대해서 잠깐 아주 간략하게 설명을 드렸었는데요 여기서 본격적으로 자세히 설명드리겠습니다. 

 

 

class Chapter:
  attack = 10
  def __init__(self, name, hp):
    self.name = name
    self.hp = hp
  def __str__(self):
    return f"{self.name} / {self.hp}"
  
class assesin(Chapter):
  attack = 200
  def __init__(self, name, hp, cloking):
    Chapter.__init__(self, name, hp)
    self.cloking = cloking

원래는 위와 같이 Chapter라는 class명을 직접 입력해주고, self까지 써줘야하는데

super()라는 녀석이 만들어지면서 이렇게 복잡하게 코드를 기재할 필요가 없게 되었습니다. 

 

이렇게 불필요한 코드를 줄 일 수 있도록 부모 class에서 자식 class로 데이터를 받아오는 일련의 행동을 오버라이딩이라고 합니다. 

 

그러나, 이러한 오버라이딩은 다중상속에서는 빛을 발하지 못합니다. 

여러 곳에서 상속을 받다보면 어떤게 super() 적용되었는지 알기가 어렵고,

설사 코드를 기재한 사람은 안다고 하더라도 함께 협업하는 사람들이 이해하기 어렵다는 단점이 있습니다. 

 

이에, 다중상속이 이루어질 때는 위와 같은 코드 방법으로 직접 적어주어야 합니다. 

 

 

이와 같이 상속과 다중상속에 대해서 알아보았습니다. 

 

다음 포스팅에서는 다형성에 대해서 알아보는 시간을 갖도록 하겠습니다. 

 

오늘도 방문하여 주셔서 감사드립니다. 

 

 

공감 부탁드립니다! ㅎ

728x90
반응형