2024. 12. 8. 17:25ㆍSTUDY/디자인 패턴
*SOLID
SRP(단일책임의 원칙 : Single Responsibility Principle) : 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다는 원칙이다.
-> serialNumber는 변화요소라 할수 없고 고유정보에 해당
-> 나머지 요소는 모두 기타의 특성과 관련된 정보이므로 변경이 발생할 수 있는 부분으로, 이 부분은 변화요소라 할 수 있다. 따라서 특정 정보에 변화가 발생하면 항상 해당 클래스를 수정해야하는 부담이 발생할 수 있으므로 이부분이 SRP적용의 대상이 된다.
-> 이렇게 분리하면 특성 정보에 변경이 일어나면 GuitarSpec 클래스만 변경하면 된다.
OCP(개방폐쇄의 원칙 : Open Close Principle) : 확장에는 열려있고, 변경에는 닫혀있어야 한다는 원리이다. 즉, 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화한다는 의미로 OCP를 가능케하는 주요 메커니즘은 추상화와 다향성이다.
-> 만약 기타가 아니라 바이올린처럼 새로운 악기가 생기다면 똑같은 구조의 클래스가 추가로 생긴다.
-> 기타뿐 아니라 새롭게 추가될 악기에 대한 추상화
-> 변경에는 비용을 줄이고 확장은 용이하게..
LSP(리스코프 치환의 원칙 : The Liskov Substitution Principle) : 상속되는 객체는 반드시 부모 객체를 완전히 대체해도 아무런 문제가 없도록 권고한다. 즉, 올바른 상속을 위해 자식 객체의 확장이 부모 객체의 방향을 온전히 따르도록 권고하는 원칙이다. 대표적인 예로 정사각형-직사각형 문제가 있으며 이러한 올바르지 못한 상속관계를 제거하고 부모 객체의 동작을 완벽하게 대체할 수 있는 관계만 상속하도록 설계한다.
-> 가급적 부모 객체의 일반 메서드를 그 의도와 다르게 오버라이딩 하지 않는 것이 중요…
ISP(인터페이스 분리의 원칙 : Interface Segregation Principle) : 객체가 반드시 필요한 기능만을 가지도록 제한하는 원칙이다.
예를 들어 왼쪽, 오른쪽의 클래스가 가운데 클래스를 상속받는다고 해보자. 이때 왼쪽 클래스는 가운데 클래스의 모든 메서드를 다 사용하지만 오른쪽은 메서드1만 사용한다. 그런데 만약에 메서드2,3이 추상클래스라 반드시 재정의를 해줘야한다면 오른쪽 클래스 입장에서는 사용하지도 않는 메서드를 굳이 재정의해줘야 한다. 따라서 각각의 메서드를 인터페이스로 만들어 필요한것만 골라서 사용하도록 하면 된다.
-> 불필요한 기능의 상속/구현을 최대한 방지함으로써 객체의 불필요한 책임을 제거한다.
DIP(의존성 역전의 원칙 : Dependency Inversion Principle) : 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다. 또한 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야한다는 원칙이다. 쉽게 말하면 "자신보다 변하기 쉬운 것에 의존하지 마라"라고 말할 수 있다. DIP하면 대표적인 예제가 바로 '자동차와 스노우 티이어 이야기'다.
*자동차와 스노우 타이어 이야기
겨울이 되면 타이어를 스노우 타이어로 변경해야 할것이다. 이러면 나중에 타이어가 추가 혹은 변경될 경우 계속해서 코드를 수정해야 할것이다. 이는 개방폐쇄원칙에 어긋난다.
위와 같이 수정하면 자동차는 타이어라는 인터페이스만 가지고 있기 때문에 변화에 민감하게 반응할 필요가 없다.
=> 의존성역전의 원칙은 중요도가 좀 떨어지는데 그 이유는 타 원칙의 하위호환 격이기 때문이다. 다른 원칙을 지키다보면 자연스럽게 준수할 수 있기 때문이다.
요약 : 객체 지향 프로그래밍을 잘하기 위해 원칙과 특성을 이해하고 사용하면 더 멋진 코딩이 가능하다
'STUDY > 디자인 패턴' 카테고리의 다른 글
[Design Pattern] 커맨드 패턴(Command pattern) (1) | 2024.12.09 |
---|---|
[Design Pattern] MVC 패턴과 MVP 패턴 (1) | 2024.12.09 |
[Design Pattern] 팩토리 패턴(Factory Pattern) (0) | 2024.12.09 |
Static, 싱글톤 (0) | 2022.07.01 |