본문 바로가기

Python 파이썬

다형성(Polymorphism)

728x90

다형성을 알아보자!

어떠한 기능이나 함수를 나타내는 것이 아니라 표현의 방법이다!

하나의 이름으로 다양한 형태를 표현할 수 있는 특성

  • 개, 고양이, 사자, 물개, 곰, 독수리, 뱀, 매미, 호랑이, 펭귄 등등
  • 위의 모든것은 동물이다
  • 일반화(상속을 통한 표현 )
  • 추상화(공통적인 특성을 선언 -> 동물은 숨을 쉰다, 움직인다 등등)
  • 다형성(공통적인 특성을 각 클래스의 특성이 맞게 재정의 -> 아가미 호흡, 폐호흡,  고양이처럼 움직인다 등등)
  • 일반화 이름을 사용하여 재정의된 함수들을 호출(동적 바인딩)
# 일자 상속 개념
 
class 동물:
    def 먹는다(self):
        pass
    def 움직인다(self):
        pass
    def 호흡한다(self):
        pass
    def 소리낸다(self):
        pass

class 포유류(동물):
    def 호흡한다(self):
        print('폐 호흡')

class 어류(동물):
    def 호흡한다(self):
        print('아가미 호흡')

class (포유류):
    def 먹는다(self):
        print('개같이 먹는다.')
    def 움직인다(self):
        print('개같이 움직인다.')
    def 소리낸다(self):
        print('개같이 소리낸다.')
    def 개특징(self):
        print('개만 가지는 특징')

class 고양이(포유류):
    def 먹는다(self):
        print('고양이같이 먹는다.')
    def 움직인다(self):
        print('고양이같이 움직인다.')
    def 소리낸다(self):
        print('고양이같이 소리낸다.')
    def 고양이특징(self):
        print('고양이만 가지는 특징')

class 고래(포유류):
    def 먹는다(self):
        print('고래같이 먹는다.')
    def 움직인다(self):
        print('고래같이 움직인다.')
    def 소리낸다(self):
        print('고래같이 소리낸다.')
    def 고래특징(self):
        print('고래만 가지는 특징')

class 상어(어류):
    def 먹는다(self):
        print('상어같이 먹는다.')
    def 움직인다(self):
        print('상어같이 움직인다.')
    def 소리낸다(self):
        print('상어같이 소리낸다.')
    def 상어특징(self):
        print('상어만 가지는 특징')

animals = [고양이(), (), 고래(), 상어()]
for a in animals:
    a.먹는다()
    a.움직인다()
    a.소리낸다()
    a.호흡한다()
    print()
# 실행결과
고양이같이 먹는다.
고양이같이 움직인다.
고양이같이 소리낸다.
폐 호흡

개같이 먹는다.
개같이 움직인다.
개같이 소리낸다.
폐 호흡

고래같이 먹는다.
고래같이 움직인다.
고래같이 소리낸다.
폐 호흡

상어같이 먹는다.
상어같이 움직인다.
상어같이 소리낸다.
아가미 호흡

보기쉽게 한글로 코딩을 했지만 한글 코딩은 지양한다. 이유는 다른 개발자의 언어에서 구동이 정상적으로

이루어 지지 않을 수 있기 때문!(걁겕글롉 과 같이 깨질 수 있다..!)

 

위 처럼 하나의 명령어로 다양한 클래스를 사용, 명령을 해 동작을 구현할 수 있다.

위는 일자상속의 개념이다! 다중상속의 개념도 알아보자.

 

# 다중 상속 개념
class 동물:
    def 먹는다(self):
        pass
    def 움직인다(self):
        pass
    def 호흡한다(self):
        pass
    def 소리낸다(self):
        pass

#공통 특성 정의
class 물에서생활하는동물:           # 새로운 특성
    def 물에서생활(self):
        print('물에서 헤엄친다.')

class 포유류(동물):                 # 동물 클래스 상속
    def 호흡한다(self):
        print('폐 호흡')

class 어류(동물):                   # 동물 클래스 상속
    def 호흡한다(self):
        print('아가미 호흡')

class (포유류):                   # 동물클래스를 상속한 포유류 클래스 상속
    def 먹는다(self):
        print('개같이 먹는다.')
    def 움직인다(self):
        print('개같이 움직인다.')
    def 소리낸다(self):
        print('개같이 소리낸다.')
    def 개특징(self):
        print('개만 가지는 특징')

class 고양이(포유류):               # 동물클래스를 상속한 포유류 클래스 상속
    def 먹는다(self):
        print('고양이같이 먹는다.')
    def 움직인다(self):
        print('고양이같이 움직인다.')
    def 소리낸다(self):
        print('고양이같이 소리낸다.')
    def 고양이특징(self):
        print('고양이만 가지는 특징')

class 고래(포유류, 물에서생활하는동물): # 다중상속 2가지를 상속받는다.
    def __init__(self, n):
        self.n = n
    def 먹는다(self):
        print(id(self.n), '고래같이 먹는다.')
    def 움직인다(self):
        print(id(self.n), '고래같이 움직인다.')
    def 소리낸다(self):
        print(id(self.n), '고래같이 소리낸다.')
    def 고래특징(self):
        print(id(self.n), '고래만 가지는 특징')
    def 물에서생활(self):
        super().물에서생활()            # 부모클래스 명시
        print(id(self.n), '호흡하러 수면위로 다닌다.')

class 상어(어류, 물에서생활하는동물): # 다중상속
    def 먹는다(self):
        print('상어같이 먹는다.')
    def 움직인다(self):
        print('상어같이 움직인다.')
    def 소리낸다(self):
        print('상어같이 소리낸다.')
    def 상어특징(self):
        print('상어만 가지는 특징')

animals = [고래(111), 상어(), 고래(222), 고양이()]    # 고래 상어 고래 고양이만 출력


for a in animals:
    a.먹는다()
    a.소리낸다()
    a.움직인다()
    a.호흡한다()
    a.물에서생활() # 속성 에러!
    print()
 
#실행 결과
1437107162800 고래같이 먹는다.
1437107162800 고래같이 소리낸다.
1437107162800 고래같이 움직인다.
폐 호흡
물에서 헤엄친다.
1437107162800 호흡하러 수면위로 다닌다.

상어같이 먹는다.
상어같이 소리낸다.
상어같이 움직인다.
아가미 호흡
물에서 헤엄친다.

1437107166352 고래같이 먹는다.
1437107166352 고래같이 소리낸다.
1437107166352 고래같이 움직인다.
폐 호흡
물에서 헤엄친다.
1437107166352 호흡하러 수면위로 다닌다.

고양이같이 먹는다.
고양이같이 소리낸다.
고양이같이 움직인다.
폐 호흡
Traceback (most recent call last):
  File "c:\Python\PYWORK\10\10_6_성적처리.py\inheritance10_animal02.py", line 78, in <module>
    a.물에서생활() # 속성 에러!
AttributeError: '고양이' object has no attribute '물에서생활'
PS C:\Python\PYWORK>

 

위 코드를 실행하면

 

 

에러가 발생한다. 해석해보면 "고양이" 에 "물에서생활"이 없다!

상속받지 않았는데 기능을 하려고 해서 에러가 났다! (받은게 없는 고양이는 억울하다..!)

 

클래스를 이용한 다형성표현법을 알아 보앗다!

728x90

'Python 파이썬' 카테고리의 다른 글

예외처리(Exception)  (0) 2023.10.24
클래스의 관계 표현, object 클래스  (0) 2023.10.24
상속, super  (0) 2023.10.24
세터,게터 (Setter, Getter)  (0) 2023.10.23
클래스(Class)를 응용해 기능을 구현해보자  (0) 2023.10.23