실행 시간 제한 | 메모리 제한 |
---|---|
1 초 | 10 MB |
이번 시간에는 클래스의 상속에 관해 이야기해 볼 거예요!
상속이라고 하면, 부모가 자식에게 무언가를 물려주는 행위를 하게 되면 자식은 부모에게서 상속받은 무언가를 사용할 수 있다는 개념입니다.
앞의 문제에서 말씀드린 것처럼
이 세상에 있는 객체들을 코드로 옮겨서 구현하려면 클래스로 구현하는 것이 좋다고 이야기했었죠?
그런데! 객체들이 비슷한 특성을 갖는 데, 아주 조금씩만 다르다면 그 객체마다 하나하나씩 클래스로 구현해야 할까요?
우리는 이 비슷한 특성들을 하나의 Class로 구현하고, 그 Class를 상속받는 형태로 구현하여 Class를 작성할 수 있습니다.
class 클래스명(상속할 클래스명):
이런식으로 클래스명 옆에 괄호 ()와 함께 상속할 클래스명을 작성하면 상속받는 클래스의 변수와 함수들을 사용할 수 있어요
자식 입장에서 상속하는 클래스는 부모클래스 (Parent Class) 또는 상위 클래스 (Super class) 라고 이야기 하구요
부모 입장에서 상속받는 클래스는 자식클래스(Child Class) 또는 하위 클래스 (Subclass) 라고 이야기 합니다.
앞의 문제에서 다루었던 Hero 클래스와 Hero 클래스를 상속받는 3명의 영웅들 (아이온맨, 헐킹, 스파이크맨)을 구현해보려고 해요
class Hero:
# 클래스 변수 선언!
hero_count = 0
def __init__(self, name):
# 인스턴스 변수의 선언!
self.name = name
self.hp = 100
# 클래스 변수의 값 변경!
Hero.hero_count = Hero.hero_count + 1
def count_apple(self, elements):
count = 0
for fruit in elements:
if fruit == '사과': # 만약 fruit이 '사과'라면?
count = count + 1
return count
def hurt(self, damage):
# 인스턴스 변수의 값 변경!
self.hp = self.hp - damage
return self.hp
def __del__(self):
# 클래스 변수의 값 변경!
Hero.hero_count = Hero.hero_count - 1
이 코드는 앞의 문제에서 구현 했었던 Hero 클래스입니다!
이 Hero 클래스와 동일한 변수와 함수 (hp, count_apple)를 사용하며, 동시에 추가적인 함수(기술)를 가지고 있는 3명의 영웅들은 어떻게 구현해야 할까요? 각각 똑같이 처음부터 구현해야 할까요?
이럴 때, 각 영웅들은 Hero 클래스를 상속을 받으면 됩니다!
class AionMan(Hero):
def __init__(self):
super().__init__('aion man')
def skill_laser_beam(self):
print('레이져 빔!')
return 35
class Hulking(Hero):
def __init__(self):
super().__init__('hulking')
def skill_body_strengthening(self):
print('육체 강화!')
return 35
class SpikingMan(Hero):
def __init__(self):
super().__init__('spiking man')
def skill_web_shooter(self):
print('거미줄 샷!')
return 35
이렇게 이전에 작성해 놓았던 클래스를 상속받아 다룰 수 가 있어요
이제 위에서 선언한 히어로 클래스들을 인스턴스로 생성하여 소환해볼게요!
aion_man = AionMan()
hulking = Hulking()
spiking_man = SpikingMan()
위의 과정으로 선언된 클래스를 토대로 실제 인스턴스를 생성할수 있어요.
현재의 hero 의 수는 몇명일까요?
# 이렇게 인스턴스로 접근도 되고
print(aion_man.hero_count)
# 3
# 상속받은 자식 클래스로 접근도 되고
print(AionMan.hero_count)
# 3
# 부모 클래스로 접근도 됩니다!
print(Hero.hero_count)
# 3
적들이 Hero들에게 과일이 담긴 리스트를 던지고 있어요
사과를 세어볼까요?
fruit_list1 = ['사과', '딸기', '사과']
fruit_list2 = ['감', '사과', '포도']
fruit_list3 = ['복숭아', '자두', '키위']
print(aion_man.count_apple(fruit_list1))
# 2
print(hulking.count_apple(fruit_list2))
# 1
print(spiking_man.count_apple(fruit_list3))
# 0
사과를 세다가 Aion Man 이 공격받았어요! 이 상황을 코드로 표현해볼까요?
print(aion_man.hurt(damage=10))
# 90
모든 히어로가 힘을 합쳐 자신들의 스킬을 사용하기로 했어요!
# 아이온맨의 고유스킬 사용
print(aion_man.skill_laser_beam())
# '레이져 빔!'
# 헐킹의 고유스킬 사용
print(hulking.skill_body_strengthening())
# '육체 강화!'
# 스파이킹맨의 고유스킬 사용
print(spiking_man.skill_web_shooter())
# '거미줄 샷!'
모든 사과를 counting 했습니다.
Hero들은 오늘도 지구를 지켰다...
전투를 마치고 Aion Man 은 상처를 치료하려고 병원으로 갔어요
남은 Hero는 몇명일까요?
del aion_man
# 이렇게 인스턴스로 접근도 되고
print(hulking.hero_count)
# 2
# 상속받은 자식 클래스로 접근도 되고
print(Hulking.hero_count)
# 2
# 부모 클래스로 접근도 됩니다!
print(Hero.hero_count)
# 2
이렇게 클래스를 상속하게 되면, 부모 클래스의 변수와 함수들을 재사용 할 수 있습니다.
클래스는 프로그래밍 언어의 객체지향이론에서 매우 중요한 역할을 하는 기능입니다.
마지막으로 코드를 작성할 때, 똑같은 기능을 하는 코드여도 어떻게 생각하고 작성하느냐에 따라 다른 코드가 구현됩니다.
이때 클래스나 함수를 잘 구조화하고 추상화를 잘하게 되면, 누가 봐도 이해하기 편하고 좋은 코드를 작성할 수 있게 돼요
따라서 단순히 코드가 실행된다고 마무리 짓기 보단, 좋은 구조를 갖도록 고려하며 작성해 보도록해요.
이제 돌핀코딩과 함께하는 파이썬 문법 자료가 마무리 되었어요
다음 시간에는 같은 기능을 수행하는 코드여도 보다 적은 메모리와 빠른 속도로 코드를 구현할 수 있는 이론인 '자료구조와 알고리즘' 을 다뤄볼거에요
이제 실습해볼까요?
실습 문제
임의의 과일 리스트와 하나의 과일 이름이 주어집니다.
이때, 주어진 과일 이름이 과일 리스트에 몇 개 담겨있는지를 구하는 함수를 작성하세요.
첫 번째 줄에는 과일 이름들이 나열되어 있고
두 번째 줄에는 개수를 세야 하는 과일의 이름이 주어집니다.
주어진 과일 이름이 과일 리스트에 몇 개 담겨있는지 출력합니다.
사과,딸기,바나나,포도,사과,딸기,포도,사과,딸기,바나나 사과
3
바나나,딸기,딸기,포도,사과,딸기,체리,사과,딸기,딸기 사과
2
출처: 돌핀 코딩