OCP
Open-Closed-Principle
개방, 폐쇠의 원리 : 클래스는 확장에 열려 있고, 수정에는 닫혀 있어야 한다.
: 클래스를 만들고 나면, 클래스의 메서드 같은 내부적으로 변형이 없어야 한다.
그러나 그 클래스에서 새로운 기능을 구현할 수 있는 방법이 열려 있다.
-> 집 열심히 만들었는데.. 집의 내부 나무, 부수고, 벽지 뜯어내고 다시 벽지를 붙이고 집을 보수하는것과
집에다가 스티커를 붙이거나, 간단한 못을 박을때, 집에다가 가구를 넣을때를 비유하면 됨...
진짜 짐 옮기는건 쉽지만, 집 때려 부수고 보수 공사하면 고생이 이만 저만이 아님 !
DRY
Don't Repeat Yourself
반복 금지의 원리 : 공통되는 부분을 추출하여 추상화하고 한 곳에 두어 중복 코드를 피하라
똑같은 기능의 중복된 코드는 하나의 클래스에서만 호출해야 한다.
즉 하나의 요구사항은 한 곳에만 두어야 한다.
->이것은 말이 되는 기능을 하나의 장소에 두는 것을 의미...
실질적으로 현실적으로 봐서 내가 짠 클래스가 말이 되게... 예를 들어 주유기가 차량에 기름을 집어 넣어야지..
주유기 자체에 기름을 집어넣는 기능이 있으면 ... 아마도 탱크로 분리시켜서 기름탱크에 주입을 시켜야 겟지...
그래야 기름을 팔 수 있으니까, 그 기름은 가솔린, 경유. 등등등. 이 과정에서 기름탱크는 또 분리될것
SRP
Single Responsibility Principle
단일 책임의 원리 : 어떤 객체는 하나의 책임만을 가지며 그 객체가 제공하는 모든 서비스는 그 클래스가 수행하는 기능만 이행해야 한다.
:어떠한 객체가 무슨일을 하던 내가 꼭 하는짓만 해야 한다.
-> 한국 IT산업을 예로 들면 프로그래머는 프로그램만을 수행하는 프로그래머 클래스라고 할때 이 프로그래머가
디자인을 수행한다거나, 한마디로 멀티플레이어가 되면 안되고 자기가 맞은 일만 수행하는것
LSP
Liskov Substitution Principle
리스코프 치환의 원리 : 자식 타입들은 부모 타입들이 사용되는 곳에 대체될 수 있어야 한다.
:상속된놈을 써먹으려고 하는데 정작 쓸 일이 없다..
클래스를 상속 받아서 오버라이드를 했는데.. 오버라이드 전의 메소드는 정작 (나는 뭐에다 쓰려고 상속한거???)
그럼 잘못된 LSP원칙 위배.
자식 타입들은 부모 타입들이 사용되는 곳에 대체될 수 있어야 한다.
이러한 오류를 막기 위한 가이드라인은 아래와 같다.
1. 다른 클래스의 기능을 사용해야 하지만 정작 그 기능을 변경하고 싶지 않다면 상속 대신 위임(Delegation) 사용을 고려하라는 가이드 라인이 있음
2. 구성(Composition)을 사용하여 다른 클래스들의 행동을 조합하라는 가이드 라인이 있음.
여기서 구성이라 함은 예를 들어 마우스는 광센서, 왼 오른쪽 버튼 등등이 있는데 여기서 마우스라는 놈이 없으면.(마우스 자체가 없다면..) 구성 요소는 무의미하다.
3. 집합(Aggregation)을 사용
여기서 집합이라 함은 한 클래스에서 다른 클래스에서 부분 사용될 수 있지만 다른 클래스의 외부에서도 여전히 존재하는 경우.
예를 들어 그릇에 햄, 달걀, 야채가 담겨 있다. 그릇에는 이러한 햄 달걀 야채 클래스를 부분 사용할 수 있지만..
이 그릇이 없어진다고 해서 햄 달걀, 야채가 없어지는건 아니다. 햄,달걀, 야채는 어디까지 또 가축 클래스(?)
에서 상속받아서 만들어진 놈.. 구성(Aggregation) 이란 개념과는 상반된다.