#객체지향의 5대 원칙
예전에 ‘제5원소’ 라는 영화를 본적이 있다. 최근 그와 관련된 인터넷 짤을 보게 되어 갑자기 떠오른게 객체지향의 5대 원칙이다. (5라는 숫자에서 왜 이게 떠올랐는지 본인도 의문이다.) 아래는 각 원칙에대한 정리이다.
</br>
#단일 책임 원칙(Single responsibility principle)
- 모든 클래스는 하나의 책임만을 가지며 객체가 변경되는 요인은 하나 뿐이여야 한다
- 책임영역이 확실해지기 때문에 연쇄작용에서 자유롭고 가독성과 유지보수 용이
- 가능한 하나(혹은 명확하게 관련이 있는) 책임을 부여 함으로써 객체는 보다 명확해지고 표현 가능해 지며, 느슨한 커플링과 높은 응집력을 얻게 된다
- 다른 4개의 원칙의 기본이 되는 법칙
- 이 원칙이 지켜지지 않을 경우 □ 클래스가 커질 경우 가독성이 떨어진다 □ 의존성이 증가한다 □ 클래스 사이의 관계를 잘 못 알고 고칠 경우 다른 기능까지 피해를 봄
</br>
#개방폐쇄의 원칙(Open close principle)
- 확장에는 열려있고, 수정에는 닫혀 있어야 한다
- 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 않아야 함
- 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다는 의미
- 이를 가능하게 하는 주요 메커니즘은 추상화와 다형성
- 적용방법 □ 수정될 것과 안그런것을 엄격히 구분 □ 위의 두 구분(만나는 지점)에 인터페이스를 정의 □ 구현에 의존하기보다는 정의한 인터페이스에 의존하도록 코딩 □ Ex) 캐릭터와 움직임 패턴. 캐릭터마다 움직임이 다를 경우 캐릭터 자체의 수정이 아닌 움직임 패턴만 재정의 함
</br>
리스코브 치환의 원칙 (Liskov substitution principle)
- 부모는 자식에 관계없이 대체 가능해야 하고, 자식은 부모타입으로 교체할 수 있어야 함
- 업캐스팅을 해도 아무런 문제가 안되어야 한다는 것
- 적용 방법 □ 여러 개체가 똑같은 일을 한다면 이들을 하나의 클래스로 표현하고 이들을 구분하는 필드를 둠 □ 똑같은 연산을 제공하지만, 이들을 약간씩 다르게 한다면 공통의 인터페이스를 만듬(인터페이스 상속) □ 공통된 연산이 없다면 별개의 클래스로 만듬 □ 추가로 무언가를 더한다면 구현 상속을 이용 □ 예시
- 도형(부모), 자식(원 / 사각형)
- 도형은 둘레를 가지고 있다 -> (원 / 사각형)은 둘레를 가지고 있다
</br>
인터페이스 분리의 원칙(Interface segregation principle)
- 사용하지 않는 기능은 처음부터 배제하고 차라리 인터페이스를 여러 개 만들어 동시에 사용할수 있도록 분리
- 사용하지 않는 인터페이스에는 영향을 받지 말아야 한다
- 적용 방법 □ 클래스의 상속을 이용하여 인터페이스를 나눔 □ 객체 인터페이스를 통한 분리(위임) □ EX) 스마트폰 기능. 전화기능과 사진기능은 별개 -> 전화할때는 사진기능을 이용하지 않음. 서로 독립적으로 구현
</br>
의존성 역전의 원칙(Dependecy inversion principle)
- 상위클래스는 하위클래스에 의존해서는 안된다
- 모든 하위 모듈은 상위 모듈을 상속해야 한다
</br>