OOP

객체지향의 5원칙 SOLID

CalebHong 2022. 6. 23. 12:26

디자인 패턴이란 객체에 대한 설계의 패턴을 말한다.

 - 객체의 기능 정의

 - 객체의 관계를 규정(설계)

 

객체에 데이터를 요구하지 말고 작업을 요청하라.
- 작자 미상

 

'토비의 스프링' 이라는 책에서 언급된 말로서 객체 지향은 데이터를 감추고 객체의 기능을 사용해야 한다는 것을 뜻한다.

 

객체지향의 5가지 원칙(SOLID)

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

 · 하나의 클래스는 하나의 책임만 가져야 한다. 다르게 말하면 하나의 클래스에 많은 기능 또는 목적을 집약시키는 것은 피해야 한다.

 · 많은 기능을 가진 클래스는 유지보수가 어렵다. S/W는 변화에 대응해야 하기에 유지보수는 불가피하다(유지보수는 숙명이다).

 · 따라서 설계 시 반드시 성능보다 유지보수성을 극대화해야 한다.

 · 책임 영역이 확실해져야 연쇄작용에서 자유로울 수 있다.

 

- OCP(Open Closed Principle) : 개방 패쇄 원칙

 · 기능 또는 목적에 따라서 객체화한다.

 · 높은 응집도와 낮은 결합도

 · 확장에 열려있고, 변경에 닫혀있다. 이는 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에 열려있고, 변경에 닫혀있어야 한다는 원리이다. 다시 말해, 추가사항이 있더라도 기존의 구성요소에는 수정이 일어나지 않아야 한다는 말이다.

 

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

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

 · 하위 클래스는 인터페이스 규약을 지켜서 작성되어야 한다.

 · 다형성을 지원하기 위한 원칙이다.

 · 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.

 · 상속을 통한 재사용은 기반 클래스와 서브 클래스 사이에 IS-A 관계가 있을 경우로만 제한 되어야 한다. 그 외의 경우에는 합성(Composition)을 이용한 재사용을 해야 한다.

 

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

 · 범용 인터페이스보다 특정 클라이언트를 위한 여러 개의 인터페이스 분리를 지향하는 원칙

 · 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다는 원리

 · 하나의 인터페이스에 하나의 책임 또는 기능, 목적을 갖도록 지향하는 것이다.

 

- DIP (Dependency Inversion Priciple) : 의존관계 역전 원칙

 · 구체화보다 추상화에 의존해야 한다. 즉, 구현 클래스(구현체)가 아니라 인터페이스(역할)에 의존해야 한다는 의미이다.

 · 추상화된 것에 의존하게 만들고, 구상 클래스에 의존하지 않게 만든다.

 · 해당 원칙에 따라 피해야 하는 3 가지

  1) 변수에 구상 클래스의 레퍼런스를 저장하지 않는다.

  2) 구상 클래스에서 유도된 클래스를 만들지 않는다.

  3) 베이스 클래스에서 이미 구현되어 있는 메소드를 오버라이드하지 않는다.

 · 훅 메소드(Hook Method) : 슈퍼클래스에서 디폴트 기능을 정의해두거나 비워두었다가 서브클래스에서 선택적으로 오버라이드할 수 있도록 만들어둔 메소드