티스토리 뷰
다형성이란?
-
어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것 )이나 오버로딩(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미한다.
-
여러 개의 클래스가 같은 이름의 메소드에 대하여 서로 다른 각자의 방법으로 작동 할 수 있는 설계를 가진다
-
하나의 데이터 유형(선조 객체)의 변수로 여러 유형의 객체 참조(후손의 객체)가 가능하다.
-
변수가 참조하는 객체의 유형에 맞는 메소드를 자동으로 호출할 수 있다.
-
추상화를 이용하여 다양한 구현을 제공한다.
-
다형성을 위한 필요 조건
-
상속관계의 클래스이면서 후손 클래스 객체에서 작동
-
후손 클래스 객체의 메소드 호출은 선조 클래스 유형의 변수를 통해야 하며 호출된 메소드는 선조 클래스 멤버이어야 한다.
-
선조 클래스와 후손 클래스에서 메소드의 원형이 같아야 한다.
-
def m_f(x, y):
print(f'values: {x} {y}')
if __name__ == '__main__':
m_f(42, 43)
m_f(42, 43.7)
m_f(42.3, 43)
m_f(42.0, 43.9)
추상화
-
상속의 유형 중에 선조 클래스의 속성과 구조를 그대로 가지면서 새로운 데이터 멤버 변수와 멤버 메소드를 추가해서 코드의 재사용을 하는 서브 클래싱형 상속과 선조클래스가 수행할 명령을 선언하고 후손 클래스가 상속을 받아 선조 클래스의 객체를 후손 클래스의 타입으로 대처를 해서 실행할 수 있게 해주는 서브타이핑형을 지원한다.
-
duck typing 은 동적 타이핑의 한 종류로 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다.
-
서브타이핑 시에 선조의 주소로 후손의 객체르 가지는 것이 아니라 추상클래스를 선언하고 재정의 하면서 후손의 객체주소를 각각 생성해서 메소드를 실행하게 된다.
-
추상클래스란 한 개 이상의 추상메소드를 가진 클래스로, 추상 메소드의 내용이 구현되지 않아 인스턴스로 생성이 불가능하며, 상속을 통해 추상 메소드를 구현해야 한다.
from abc import abstractclassmethod, ABCMeta
class Base(metaclass=ABCMeta): # 추상 클래스 선언
@abstractclassmethod # 추상메소드
def start(self):
print('base start')
@abstractclassmethod
def stop(self):
print('base stop')
클래스 내에 멤버 메소드 선언 바로 위에 데코레이션 설정
-
@abstractmethod : 메소드를 추상메소드로 지정
-
@property : 메소드를 변수로 호출 할 수 있도록 지정
-
@staticmethod : 정적 메소드로 선언
-
@classmethod : 클래스 인스턴스 메소드로 선언
def make_cal(op):
if op == '+':
return lambda x, y: x + y
if op == '-':
return lambda x, y: x - y
if op == '*':
return lambda x, y: x * y
if op == '/':
return lambda x, y: x / y
if __name__ == '__main__':
plus = make_cal('+')
print(plus(1, 2))
# 원하는 기능을 수행하는 함수
def big_number(n):
return n ** n ** n
def say_hello():
print('ㅎㅇㅎㅇ?')
# 데코레이터 기능을 수행하는 함수
def make_func_notification(func):
def new_func(*args, **kwargs):
print('함수 시작')
result = func(*args, **kwargs)
print('함수 종료')
return result
return new_func
if __name__ == '__main__':
print(big_number(3))
print('-------------')
new_func = make_func_notification(big_number)
print(new_func(3))
print('-------------')
say_hello()
say_hello = make_func_notification(say_hello)
say_hello()
# 데코레이터 사용
@make_func_notification
def say_goodbye():
print('ㅂㅂㅂ')
print('-------------')
say_goodbye()
# static method
# 인스턴스 메소드 사용 불가
class Calc:
@staticmethod
def add(x, y):
return x + y
@staticmethod
def mul( x, y):
return x * y
if __name__ == '__main__':
print(Calc.add(10, 20))
print(Calc.mul(10, 20))
# class method
class Animal:
level = 0
@classmethod
def show_level(cls):
return cls.level
@staticmethod
def show():
print('show')
class Dog(Animal):
level = 1
if __name__ == '__main__':
print(Animal.show_level())
print(Dog.show_level())
print('------------')
Animal.show()
Dog.show()
# getter, setter
class Person:
def __init__(self):
self.__age = 0
@property
def age(self): # getter
return self.__age
@age.setter
def age(self, value): # setter
self.__age = value
if __name__ == '__main__':
james = Person()
james.age = 20
print(james.age)
from abc import abstractclassmethod, ABCMeta
class Unit(metaclass=ABCMeta): # 추상 클래스 선언
def __init__(self, name):
self.name = name
def create(self):
print('유닛이 생성되었습니다.')
@abstractclassmethod
def sound(self):
print('소리를 냅니다.')
@abstractclassmethod
def attack(self):
pass
class Marine(Unit):
def __init__(self, name):
super().__init__(name)
def sound(self):
print('헛둘헛둘')
def attack(self):
print('두두두두')
class Tank(Unit):
def __init__(self, name):
super().__init__(name)
def sound(self):
print('위이이이잉~')
def attack(self):
print('쾅쾅!')
def move_unit(unit):
unit.create()
unit.sound()
unit.attack()
if __name__ == '__main__':
m = Marine('해병대')
t = Tank('시즈탱크')
for u in [m, t]:
move_unit(u)
'Python' 카테고리의 다른 글
쓰레딩(Threading (0) | 2020.08.29 |
---|---|
예외처리 - Exception Handling, 사용자 Exception, assert 와 unittest (0) | 2020.08.28 |
상속 - super(), 오버라이딩, 다중상속 (0) | 2020.08.28 |
클래스 - 클래스 변수, 인스턴스 변수, 클래스 메소드, 정적 메소드 (0) | 2020.08.28 |
함수 - 파라미터, 람다함수, 고차함수, 재귀함수, 스코핑룰 (0) | 2020.08.28 |
- Total
- Today
- Yesterday
- oracle
- mapreduce
- jdbc
- aop
- maven
- HDFS
- 하둡
- File Protection
- SPARK
- Disk Scheduling
- 빅데이터 플랫폼
- Spring
- Allocation methods
- vmware
- Flume
- linux
- Variable allocation
- Free space management
- SQL
- springboot
- RAID Architecture
- I/O Mechanisms
- JSON
- hadoop
- gradle
- Disk System
- I/O Services of OS
- Replacement Strategies
- Java
- 빅데이터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |