객체 지향 설계 5원칙

객체 지향 설계에는 다음과 같은 5가지 원칙이 있다. 

 

1. SRP (Single Responsibility Principle) : 단일 책임 원칙

2. OCP (Open-Closed Principle) : 개방 폐쇄 원칙

3. LSP (Liskov Substitution Principle) : 리스 코프 치환 원칙

4. ISP (Interface Segragation Principle) : 인터페이스 분리 원칙

5. DIP (Dependency Inversion Principle) : 의존 관계 역전 원칙

앞 글자들을 모아 SOLID라고 부르기도 한다. 

 

 

1.  SRP (Single Responsibility Principle) : 단일 책임 원칙

하나의 클래스는 하나의 책임을 가져야한다.

"어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다"

 

이를 지키지 않으면 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 끼친다

 

책임이란, '기능' 정도로 생각하면 된다. 만약 한 클래스가 수행할 수 있는 기능 (책임) 이 여러 개라면, 클래스 내부의 함수끼리 강한 결합을 발생할 가능성이 높아진다.  -> 유지보수가 비효율적

 

새로운 변경사항이 생기면 클래스 내부의 동작들이 연쇄적으로 변경되어야 할 수 있으므로 한 클래스는 한가지의 기능(책임)을 가지도록 잘게 쪼게어 분리시키는게 좋다

 

A클래스의 메소드의 결과로 B 클래스의 메소드 결과에 영향을 끼친다면 A클래스를 수정하게되면 B클래스도 같이 수정해줘야되는 경우가 생김

 

2. OCP (Open-Closed Principle) : 개방 폐쇄 원칙

소프트웨어 구성요소(컴포넌트, 클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.

이는 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 함을 의미한다

기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 함

 

어떤 모듈의 기능을 하나 수정할 때, 그 모듈을 이용하는 다른 모듈들 역시 줄줄이 고쳐야 한다면 유지보수가 복잡할 것

 

3. LSP (Liskov Substitution Principle) : 리스 코프 치환 원칙

프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다

 

이는 "서브 타입은 언제나 기반 타입으로 교체할 수 있다"는 뜻이다. 즉, 서브 타입은 언제나 기반 타입과 호환될 수 있어야 한다. 따라서 서브 타입은 기반 타입이 약속한 규약을 지켜야 한다. 

 

  • 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 함
    → 즉, 상위 타입 객체를 하위 타입 객체로 치환해도 정상적으로 동작해야 함
  • 리스코프 치환 원칙을 지키지 않으면 개방 폐쇄 원칙을 위반하게 된다.

 

4. ISP (Interface Segragation Principle) : 인터페이스 분리 원칙

 

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다

 

이는 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다는 원칙이다. 즉, 어떤 클래스가 다른 클래스에 종속될 때에는 가능한 최소한의 인터페이스만을 사용해야 한다.

 

SRP가 클래스의 단일 책임을 강조했다면, ISP는 인터페이스의 단일 책임을 강조한다. 

 

  • 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
  • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
  • → 하나의 통상적인 인터페이스보다는 차라리 여러 개의 세부적인 (구체적인) 인터페이스가 나음
  • 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 함

클라이언트가 사용하는 않는 인터페이스가 변경되더라도 기존의 인터페이스에는 영향이 없어야한다.

5. DIP (Dependency Inversion Principle) : 의존 관계 역전 원칙

 

프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안 된다

 

의존 관계를 맺을 때, 변하기 쉬운 것 (구체적인 것) 보다는 변하기 어려운 것 (추상적인 것)에 의존해야 함

 

이는 추상화(인터페이스)에 의존해야지, 구체화(클래스)에 의존하면 안 된다는 것이다. 

 

 

요리사- > 치킨조리법 (추상,인터페이스)

 

치킨조리법 = 간장치킨,양념치킨,후라이드치킨,오븐치킨 (구체화,클래스)

 

요리사(객체)가 치킨조리법(인터페이스)가 아닌 간장치킨(클래스)에만 의존을 한다면  레시피를 변경 할 떄 마다 

요리사가 계속해서 양념치킨, 후라이드치킨,오븐치킨 등등 계속 가지고 있는 조리법을 변경시켜줘야함, 

반면 인터페이스에 의존한다면 치킨조리법이라는 전체요리방법을 가지고 하위로 여러 조리법을 이용한다면 요리사는 

변경 없이 치킨조리법 하나로 여러가지 치킨을 만들 수 있다.

 

더 읽어보기 - [Python] Python Clean code - SOLID 원칙 (velog.io) 파이썬으로 정리 잘되있음

'CS' 카테고리의 다른 글

DB인덱스란?  (1) 2023.02.03
TDD란?  (0) 2023.02.03
깃(Git)과 깃허브(GitHub)  (0) 2023.01.15
디자인패턴이란?  (0) 2023.01.10
컴파일러란?  (0) 2023.01.06

+ Recent posts