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) 이란 개념과는 상반된다.



출처 : http://blog.naver.com/taehun3718