다형성(polymorphism)
다형성은 한 형태가 다른 형태로 발생하는 조건을 의미합니다. 이 다형성은 프로그래밍에서 매우 중요한 개념으로 단일 유형의 연산자, 개체등을 다른 조건이나 시나리오에서 다른 형태로 사용하는 것을 의미합니다. 예를 들어 덧셈 연산자인 +
는 숫자형 뿐만 아니라 문자형에서도 사용될 수 있으며 각 사용처에 따라 그 용도 역시 차이가 납니다.
- 숫자 : 덧셈
- 문자 : 연결
x, y=2, 3 x+y
5
str1="pyhton" str2="polymorphism" str1+" "+str2
'pyhton polymorphism'
위와 같이 동일 대상의 사용의 차이를 다형성(polymorphism)이라고 합니다.
거의 모든 python 객체에서 사용되는 len()
함수는 대상의 길이를 반환합니다. 그러나 그 함수의 대상이 되는 인수가 문자열, 리스트, 사전에 따라 반환하는 결과에 차이를 나타냅니다.
11
y=[1, 2,"apple", "computer"] #리스트를 구성하는 원소 수를 반환 len(y)
4
z={"computer": 2, "apple":1} #사전 형식의 key:value의 pair의 수를 반환 len(z)
2
위와같이 다형성은 함수를 다양한 조건에서 사용할 수 있게 합니다. 이러한 용도는 클래스로 확대할 수 있습니다.
class staff1: def __init__(self, name, age, grade): self.name=name self.age=age self.grade=grade def info(self): print(f"성명: {self.name}") print(f"나이: {self.age}") print(f"수준: {self.grade}") class staff2: def __init__(self, name, age, grade): self.name=name self.age=age self.grade=grade def info(self): print(f"성명: {self.name}") print(f"나이: {self.age}") print(f"수준: {self.grade}")
x=staff1("Ali", 27, 3) y=staff2("Brian", 49, 1) for i in (x, y): i.info()
성명: Ali 나이: 27 수준: 3 성명: Brian 나이: 49 수준: 1
위 두개의 클래스는 같은 형식과 내용을 가집니다. 물론 같은 형식의 수퍼클래스와 그 클래스를 상속받는 서브클래스를 작성할 수 있습니다.그러나 위와같이 다른 클래스내에 존재하는 동일한 이름의 함수를 다음과 같이 튜플 형식으로 그룹화하여 반복자로 적용할 수 있습니다. 이것 역시 튜플을 다른 조건에서 다른 형태로 사용할 수 있는 다형성의 예입니다.
위 코드에서 print() 형식으로 포멧문자열 리터럴을 사용하였습니다. 이는 문자열 앞 부분에 f 또는 F 와 함께 {표현식}을 사용한 것입니다.
print(f"4의 제곱근은 {4**0.5}과 {-4**0.5} 입니다.")
4의 제곱근은 2.0과 -2.0 입니다.
클래스의 함수 재정의(overriding) 역시 다형성이 적용된 것입니다.
from math import pi class Shape: def __init__(self, name): self.name=name def totLength(self): pass def area(self): pass def fact(self): return("2차원 도형을 나타냅니다.") def __str__(self): #자료형에 연산을 실시하기 위한 형식: __메소드__ return (self.name) class Square(Shape): def __init__(self, length): super().__init__("Square") #super()는 수퍼클래스를 의미하는 것으로 상속하는 클래스의 변수의 초기값을 설정. self.length=length def totLength(self): return (4*self.length) def area(self): return(self.length**2) def fact(self): return("정사각형은 4변이 같고 각 변의 사잇각은 90도 입니다.") class Circle(Shape): def __init__(self, radius): super().__init__("Circle") self.radius=radius def totLength(self): return (2*pi*self.radius) def area(self): return(pi*self.radius**2) def fact(self): return(f"반지름 {self.radius}인 원입니다.")
a=Square(5) b=Circle(10) print(a, b)
Square Circle
print(a.totLength(), b.totLength())
20 62.83185307179586
print(a.area(), b.area())
25 314.1592653589793
print(a.fact())
정사각형은 4변이 같고 각 변의 사잇각은 90도 입니다.
print(b.fact())
반지름 10인 원입니다.
위 코드에서 클래스 Square와 Circle는 Shape를 상속받지만 수퍼클래스의 함수들을 재정의 합니다. 이것은 같은 이름의 객체를 조건을 변경하여 사용하는 것으로서 다형성의 예입니다.
댓글
댓글 쓰기