[OPP] SOLID 원칙

seheo·2022년 7월 18일
0

Software Engineering

목록 보기
3/5

객체지향 설계 원칙

객체지향적으로 장점을 최대한 활용할 수 있도록 설계하기 위해서는 SOLID라는 설계원칙을 준수하여 설계하여야 한다.
SOLID 윈칙은 5가지 설계원칙의 앞글자만 따왔다.

SRP (Single Responsibility) 단일 책임의 원칙

  • 하나의 클래스는 하나의 책임(기능)을 가져야한다
  • 클래스를 변경하는 이유는 단 하나여야 한다
  • 이 원칙을 지키지 앟는 경우 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미칠 수도 있다.
    • 유지보수가 매우 비효율적
  • 자동차를 객체지향적으로 만든다면 자동차라는 하나의 큰 클래스로 만들면 안된다.
    • 핸들 클래스, 바퀴 클래스, 엔진 클래스 세부적인 기능을 하는 클래스로 쪼개어 설계해야 된다.

OCP (Open-Closed) 개방-폐쇄의 윈칙

  • 확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다
    • 확장에 대해 열려 있다: 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다.
    • 수정에 대해 닫혀 있다: 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다.
  • 쉽게 말하면 기능을 추가할때는 기존의 코드를 변경하지 않고 기능을 추가 할 수 있어야 한다.
  • 이를 지키지 않으면 어떤 모듈의 기능을 수정할 때, 그 모듈을 이용하는 다른 모듈들도 고쳐야 하여 유지보수가 어려워 진다.
  • 부모 추상 클래스 동물, 자식 클래스 강아지, 고양이, 소
    • 동물 클래스에 울음이라는 메소드만 추상메소드로 정의하여 새로운 동물 말이 생겼을때 새로운 자식 클래스를 만드는 것으로 확장은 열고, 다른 동물클래스의 영향을 미치지 않기 때문에 수정에 대해서는 닫혀있다.

OCP 는 추상화 (인터페이스) 와 상속 (다형성) 등을 통해 구현해낼 수 있다.
자주 변화하는 부분을 추상화함으로써 기존 코드를 수정하지 않고도 기능을 확장할 수 있도록 함으로써 유연함을 높이는 것이 핵심이다.

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

  • 하위 클래스는 상위 클래스에서 가능한 가능한 행위를 수행할 수 있어야 한다.
  • 상속관계가 아닌데 억지로 상속관계를 설정한다면, 이 윈칙이 위배된다.
  • 로보트(부모) - AI로봇(자식)
    • 로봇은 무조건 10x10이라는 특징을 가진다
    • AI로봇이 기능을 구현하다가 크기를 건드리게 되어 로봇에서는 실행되지 않는다면 LSP위배

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

  • 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
  • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
    • 하나의 통상적인 인터페이스보다는 차라리 여러 개의 세부적인 (구체적인) 인터페이스가 나음
    • 예시) 프린트는 복사와 프린트 기능만 필요하고 복합기는 팩스기능까지 필요하다면 인터페이스를 다 따로 만들어 구현
  • 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 함

DIP (Dependency Inversion) 의존 역전 원칙

  • 의존 관계를 맺을 때, 변하기 쉬운 것 (구체적인 것) 보다는 변하기 어려운 것 (추상적인 것)에 의존해야 함
    • 의존, 관계 : 다른 곳에서 기능을 가져와서 사용하는 것
    • 구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다는 뜻
  • 즉, 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 됨
  • 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 함
  • 저수준 모듈이 변경되어도 고수준 모듈은 변경이 필요없는 형태가 이상적

총 정리

SRP 와 ISP 는 객체가 커지는 것을 막아준다.
객체가 단일 책임을 갖도록 하고 클라이언트마다 특화된 인터페이스를 구현하게 함으로써 한 기능의 변경이 다른 곳까지 미치는 영향을 최소화하고, 이는 기능 추가 및 변경에 용이하도록 만들어 준다.

LSP 와 DIP 는 OCP 를 서포트한다.
OCP 는 자주 변화되는 부분을 추상화하고 다형성을 이용함으로써 기능 확장에는 용이하되 기존 코드의 변화에는 보수적이도록 만들어 준다. 여기서 '변화되는 부분을 추상화'할 수 있도록 도와주는 원칙이 DIP 이고, 다형성 구현을 도와주는 원칙이 LSP 인 것이다.

참고자료

[개발자 면접 질문] 객체지향 프로그래밍 - 설계 5대 원칙, SOLID
SOLID 원칙, 어렵지 않다!
위키북스, 오브젝트 코드로 이해하는 객체지향 설계, 조영호

0개의 댓글