객체지향 설계의 5가지 원칙
- SRP: 단일 책임 원칙
- OCP: 개방, 폐쇄 원칙
- LSP: 리스코프 치환 원칙
- ISP: 인터페이스 분리 원칙
- DIP: 의존성 역전 원칙
스마트폰은 계산기, 전화기, 인터넷컴퓨터, 메모장의 기능을 가지고 있다.
단일 책임 원칙을 적용하자면 계산기로써 책임, 전화기로써 책임, 인터넷컴퓨터로써 책임, 메모장으로써 책임이 분리된다.
웹개발자가 한명 있다. 회사에 마케팅 인력이 부족하다. 웹 개발자를 마케팅 인력으로 사용하기 위해 마케팅 연수를 보내 마케팅 인력으로 변경했다
(OCP 위반)
웹개발자가 한명 있다. 회사에 인공지능 인력이 필요하다. 웹 개발자가 이미 다루고 있는 언어를 고려해 해당 언어로 만들어진 인공지능 툴에 대한 연수를 보내 인공지능 인력으로 변경했다.
(OCP 충족)
식칼을 만드는 장인 부모 밑에서 태어나 가업을 물려받은 자식이 칼을 만들지 못하고 망치를 만들고 있다
(LSP 위반)
식칼을 만드는 장인 부모 밑에서 태어나 가업을 물려받은 자식은 전투용 칼을 만들어 낸다
(LSP충족)
건설회사가 병원을 건축하는데 본관, 입원병동, 연구병동 세가지 시설을 건축해야 한다. 각 건물에 해당하는 표준 설계도 3개를 모아서 각 건물을 담당하는 담당자에게 모두 줬다.
(ISP 위반)
건설회사가 병원을 건축하는데 본관, 입원병동, 연구병동 세가지 시설을 건축해야 한다. 각 건물에 해당하는 표준 설계도 3개를 맡은 건물에 맞게 건축 담당자에게 한개씩 분배했다.
(ISP 충족)
이제 개발을 막 시작한 개발자에게 특정 프레임워크에 특정 기능 사용하는 방법을 알려줬다.
(DIP 위반)
이제 개발을 막 시작한 개발자에게 클래스와 함수의 구동 원리, 프레임워크 동작방식을 파악하는 방법을 알려주고 어떤 기능 구현을 담당하게 했다.
이 개발자는 프레임워크 종류와 상관없이 어떤 프레임워크등 같은 기능을 구현해냈다.
(DIP 충족)
class User:
def __init__(self, hp, mp, damage):
self.hp = hp
self.mp = mp
self.damage = damage
def get_damage(self):
return self.damage
def attack(self, enemy):
self.hp = self.hp - enemy.get_damage()
def attacked(self, damage):
self.hp = self.hp - damage
def get_status(self):
return f"hp:{self.hp}, mp:{self.mp}, damage:{self.damage}"
redteam = User(100, 100, 50)
blueteam = User(100, 100, 30)
readteam.attack(blueteam)
print(bludteam.get_status()
# result: "hp:50, mp:100, damage:30"
class User:
def __init__(self, hp, mp, damage):
self.hp = hp
self.mp = mp
self.damage = damage
def attacked(self, damage):
self.hp = self.hp - damage
def get_damage(self):
return self.damage
def get_status(self):
return f"hp:{self.hp}, mp:{self.mp}, damage:{self.damage}"
class Battle:
def __init__(self, attacker, target)
self.attacker = attacker
self.target = target
def fight(self, attacker, target):
damage = attacker.get_damage()
target.attacked(damage)
redteam = User(100,100,50)
blueteam = User(100,100,30)
Battle.fight(redteam, blueteam)
print(redteam.get_status(), blueteam.get_status())
# result: "hp:100, mp:100, damage:50", "hp:50, mp:100, damage:30"