-
Python: 객체 지향 프로그래밍을 위한 4가지 기본개념 (상속, 추상화, 캡슐화, 다형성)1Python 2020. 8. 16. 13:34
객체 지향 프로그램을 다루기 위해서는 알아야 할 4가지 기본개념에 대해 알아봅시다.
크게 4가지로 나뉩니다.
- 상속
- 추상화
- 캡슐화
- 다형성
하나씩 차례로 알아봅시다.
< 상속 >
재산상속할때 그 상속입니다. 사전적 의미를 살펴보면 상속은 일정한 친족 관계가 있는
사람사이에서 한 사람이 다른 사람에게 재산에 관한 권리와 의무의 일체를
이어 받는 일이라고 합니다.
상속이라는 의미 그대로 상속을 해주는 클래스를 부모 클래스, 상속을 받는 클래스를
자식클래스로 정합니다. 그리고 자식클래스는 부모클래스의 모든것을 물려받습니다.
자식 클래스는 부모 클래스의 함수와 변수를 물려받아 사용하고
필요할때는 부모 클래스의 함수와 변수를 바꾸어 사용하기도 합니다.
함수를 바꾸어 사용하는 것을 오버라이딩(overriding)이라고 합니다.
간단한 예시로 공부해봅시다.
무기(Weapon) 클래스를 상속받아 총(Gun)클래스를 만들어 보죠
class Weapon: def __init__(self, weapon_name, power): self.power = power self.weapon_name = weapon_name def use_on(self): print("{}의 데미지로 공격!".format(self.power)) def __str__(self): return "무기종류: {}\n공격력: {}".format(self.weapon_name, self.power)
이제 Weapon 클래스를 상속받아 Gun클래스를 만들어줍니다.
class Gun(Weapon): def __init__(self, weapon_name, power, bullet_count): super().__init__(weapon_name, power) self.bullet_count = bullet_count def use_on(self): super(Gun, self).use_on() self.bullet_count -= 1 def count_left_bullet(self): return self.bullet_count
__init__ 메소드와 use_on 메소드를 오버라이딩하여 사용하였습니다.
그리고 count_left_bullet 이라는 메소드를 추가해주었습니다.
__str__ 메소드만 건드리지 않았습니다.
우선 무기 클래스가 잘 출력이되는지 확인해봅시다.
weapon = Weapon("몽둥이", 100) print(weapon) weapon.use_on()
무기종류: 몽둥이 공격력: 100 100의 데미지로 공격!
Gun 인스턴스는 Weapon 클래스의 함수와 변수도 가지고 있기 때문에
부모 클래스의 메소드 또한 사용할 수 있습니다.
gun = Gun("리볼버", 250,10) print(gun) gun.use_on() print("남은 총알 수: {}".format(gun.count_left_bullet())) gun.use_on() gun.use_on() gun.use_on() print("남은 총알 수: {}".format(gun.count_left_bullet()))
무기종류: 리볼버 공격력: 250 250의 데미지로 공격! 남은 총알 수: 9 250의 데미지로 공격! 250의 데미지로 공격! 250의 데미지로 공격! 남은 총알 수: 6
참고로 파이썬에서는 다중상속을 지원합니다. 다중상속은 하나의 자식 클래스가
여러 부모 클래스를 상속하는 경우를 의미합니다.
사실 다중상속은 여러가지 클래스를 상속받을 때 문제가 생길 수 있기 때문에
권하지 않는다고 합니다. 그래서 자바 같은 언어는 다중상속 자체를 못하게 되어있거든요
class A: def __init__(self): pass class B: def __init__(self): pass class C(A, B): def __init__(self): super().__init__() pass
클래스 C에서 부모클래스를 뜻하는 super()를 가져오게 되면 에러가 생기지는 않지만
Super가 A 클래스인지, B 클래스인지 혼동이 생길 수 있기 때문에
(참고로 A가 super로 선택됩니다)
다중상속을 지양한다고 합니다. (뿐만 아니라 메소드의 이름이 같은 경우)
< 추상화 >
우선 추상화라는 사전적 정의를 한번 짚어봅시다. 추상화는
필요한 부분, 중요한 부분을 통합하여 하나로 만드는 것을 말합니다.
좀 더 쉽게 말하면 중요한 특징을 찾아낸 후 간단하게 표현하는 것이죠.
예를 들어, 강아지 집을 만들고 싶어서 강아지 집 설계도를 만들어 보려고 합니다.
설계도를 만들기 전에 필수적으로 떠올려 하는 요소들이 있을 겁니다.
예를 들어 지붕, 창문, 누울 공간등이 있습니다.
이런 내용을 바탕으로 설계도 안에는 지붕 설계, 창문 설계, 누울 공간설계등이 들어갑니다.
이 과정이 추상화 과정입니다.
어떠한 class를 만들기 전에 그 class를 어떻게 만들 것인지 미리 설계하고 들어가는 과정으로
추상화 클래스(abstract class)라는 것을 만듭니다.
추상화 클래스란 추상화 메소드가 하나라도 있는 클래스를 추상화클래스라고 합니다.
(추상화 클래스안에 일반메소드가 있어도 상관없습니다)
만약 추상화 클래스안의 메소드가 모두 추상화 메소드라면 인터페이스라고도 합니다.
아무튼! 추상화 클래스에서 만들어준 추상화 메소드나 변수는
다음에 상속 받을 자식 클래스안에서 반드시 오버라이딩 되어야 합니다.
예시로 한번 강아지 집(DogHouse) 클래스를 만들어봅시다.
지붕 메소드, 창문 메소드, 공간 메소드 그리고 변수 하나를
자식 클래스에서 만들어줄겁니다.
from abc import ABC, abstractmethod class DogHouse(ABC): @abstractmethod def create_roof(self, roof_color): # 지붕 만들기 pass @abstractmethod def creat_windows(self, window_count): # 창문 만들기 pass @abstractmethod def creat_space(self, where): # 공간 사이즈 정하기 pass @property def count(self): # 집에 살 강아지 수 pass
추상화 클래스를 만들기 위해
ABC 모듈과 abstractmehtod를 import를 한 후 ABC를 상속받습니다.
모든 메소드마다 pass라고 되어 있는건 DogHouse 클래스의 메소드들을
MyDogHouse에서 오버라이딩하여 완성시켜주기 위함입니다.
그리고 마지막으로 dog_count라는 변수를 자식 클래스에서 만들어주고 싶어서
@property 데코레이팅하여 count라는 함수를 만들어주었습니다.
그리고 추상화 메소드로 만들고 싶은 메소드 위에
@abstractmethod라고 데코레이팅 해줍니다.
데코레이터가 무엇인지 궁금하다면 참고합시다.
이제 위에서 만든 추상화 클래스를 상속받아
MyDogHouse 클래스를 만들어보겠습니다.
class MyDogHouse(DogHouse): def create_roof(self, roof_color): self.roof_color = roof_color def creat_windows(self, window_count): self.window_count = window_count def creat_space(self, where): self.where = where @property def count(self): return self.dog_count @count.setter def count(self, dog_count): self.dog_count = dog_count def __str__(self): return "강아지집 정보\n\n지붕 색: {}\n창문 갯수: {}\n공간: {}\n집에 사는 강아지수: {}".format(self.roof_color,self.window_count, self.where, self.dog_count)
DogHouse에 있던 모든 추상화 메소드를 오버라이딩하였고
count 함수에 대해 getter와 setter를 만들었습니다.
그리고 마지막으로 __str__이라는 일반 메소드도 추가해주었습니다.
my_dog_house = MyDogHouse() my_dog_house.create_roof("빨강") my_dog_house.creat_windows(2) my_dog_house.creat_space("4평") my_dog_house.count = 3 # count함수의 setter를 이용하였습니다 print(my_dog_house)
강아지집 정보 지붕 색: 빨강 창문 갯수: 2 공간: 4평 집에 사는 강아지수: 3
저만의 강아지집이 잘 완성되었습니다.
캡슐화와 다형성에 대한 설명은 아래 있습니다.
반응형'Python' 카테고리의 다른 글
Python: 견고한 객체지향 프로그래밍 SOLID 설계원칙 공부하기! (0) 2020.08.16 Python: 객체 지향 프로그래밍을 위한 4가지 기본개념 (상속, 추상화, 캡슐화, 다형성)2 (0) 2020.08.16 Python: 파이썬 데코레이터(Decorator) 공부하기! (0) 2020.08.15 Python: 객체지향언어? 클래스(class)? 기초 공부하기! (0) 2020.08.15 Python: 파이썬으로 로또를 만들어보자! (0) 2020.06.30