본문 바로가기
파이썬/파이썬의 디자인 패턴 공부

01_01 디자인 패턴 개요: 객체지향 디자인의 기본 원칙

by David.Ho 2023. 12. 6.
728x90
반응형

개방-폐쇄 원칙(The open/Close Principle)

정의: 클래스와 객체, 메소드 모두 확장엔 개방적이고 수정엔 폐쇄적이어야 한다는 원칙이다.

 클래스 또는 객체의 기능을 확장할 때, 기본 클래스 자체를 수정하지 않아도 되도록 클래스와 모듈을 설계해야 한다. 클래스 확장만으로 새로운 기능을 구현할 수 있어야 한다.

 추상(abstract)클래스를 수정하지 않고 확장해서 새로운 기능을 추가하는 것이 개방-폐쇄 원칙을 따르는 것이다.

[원칙의 장점]
(1) 기본 클래스를 변경하지 않기 때문에 문제가 발생할 가능성이 낮다.
(2) 기본 버전과의 호환성 유지가 수월하다.

제어 반전 원칙(The Inversion of Contral Principle)

정의: 상위 모듈은 하위 모듈에 의존적이지 않아야 한다는 원칙이다. 가능한 모두 추상화에 의존해야 한다. 추상화가 세부 사항에 의존하는 상황은 바람직하지 않다.

 이 원칙에 의하면 모듈들은 지나치게 상호 의족적이지 않아야 하며, 추상화를 통해 기본 모듈과 종속 모듈을 분리시켜야만 한다.

 

 그리고 또한, 제어 반전 원칙은 클래스의 세부 내용은 추상화돼야 한다는 것을 의미하기도 한다. 세부 구현이 추상화를 결정하는 상황은 반드시 피해야 한다.

[원칙의 장점]
(1) 모듈 간의 낮은 상호 의존도는 시스템 복잡도를 줄인다.
(2) 종속 모듈 사이에 명확한 추상화 계층(hook 또는 매개 변수를 통해 지원)이 있기 때문에 모듈 간의 종속 관계를 쉽게 알 수 있다.

인터페이스 분리 원칙(The Interface Segregation Principle)

정의: 클라이언트는 불필요한 인터페이스에 의존하지 않아야 한다는 원칙이다.

 이 원칙은 효율적인 인터페이스 작성을 유도한다.

 개발자는 반드시 해당 기능과 관련 있는 메소드만을 작성해야 한다.  만약 해당 인터페이스와 상관없는 메소드를 포함하는 인터페이스를 구현했다면 이후에 클래스에는 필요 없는 메소드까지 구현해야 한다.

예를 들어 Pizza 인터페이스에는 add_chicken()과 같은 메소드가 필요하지 않다. Pizza 인터페이스를 구현하는 Veg Pizza(야채피자) 클래스에 이러한 메소드를 강요하지 않아야 한다.
[원칙의 장점]
(1) 인터페이스에 꼭 필요한 메소드만 포함하는 가변운 인터페이스를 작성할 수 있다.
(2) 인터페이스에 불필요한 메소드가 포함되는 것을 방지한다.

단일 책임 원칙(The Single Responsibility Principle)

정의: 클래스는 하나의 책임만을 가져야 한다는 원칙이다.

 클래스는 구현할 때 한 가지 기능에만 중점을 둬야 한다. 두 가지 이상의 기능이 필요하다면 클래스를 나눠야 한다. 이 원칙에는 클래스는 기능으로 인해 변경된다. 특정 기능의 작동 방식이 변경돼 클래스를 수정하는 것은 허용되지만 두 가지 이상의 이유(두 가지 기능 변경) 때문에 클래스를 수정해야 한다면, 클래스는 분할돼야 한다.

[원칙의 장점]
(1) 어떤 기능을 수정할 때, 특정 클래스만 변경된다.
(2) 한 개의 클래스에 여러 기능이 있는 경우, 종석된 클래스도 여러 가지 이유로 변경돼야 한다. 위의 상황을 방지 할 수 있다.

치환 원칙(The Substitution Principle)

정의: 말 그대로 파생된 클래스는 기본 클래스를 완전히 확장해야 한다는 이야기다. 코드 수정 또는 추가 없이도 파생된 클래스는 기본 클래스를 대체할 수 있어야 한다.

728x90
반응형

댓글