TIL #6 220202

Subeeen·2022년 2월 2일
0

Today I Learned

목록 보기
6/18
post-thumbnail

객체 지향의 5원칙, SOLID

객체 지향 설계(OOD; Object Oriented Design)의 정수라고 할 수 있는 5원칙 개념이 SOLID다. SOLID는 아래 5가지 원칙의 알파벳을 따서 부르는 이름이다.

  • SRP(Single Responsibility Principle) : 단일 책임 원칙
    어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.
  • OOP(Open Closed Principle) : 개방 폐쇄 원칙
    자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
  • LSP(Liskov Subsititution Principle) : 리스코프 치환 원칙
    서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
  • ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
    클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.
  • DIP(Dependency Inversion Principle) : 의존 역전 원칙
    자신보다 변하기 쉬운 것에 의존하지 마라.

이 원칙들도 응집도는 높이고(High Cohesion), 결합도는 낮추는(Loose Coupling) 원칙을 객체 지향의 관점에서 재정립한 것이다.

결합도와 응집도
1. 결합도는 모듈(클래스)간의 상호 의존 정도로서 결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어 객체의 재사용이나 수정, 유지보수가 용이하다.
2. 응집도는 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성으로, 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져 재사용이나 기능의 수정, 유지보수가 용이하다.

SRP - 단일 책임 원칙

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

클래스가 여러가지 일을 하면 역할과 책임이 많아지게 된다. 따라서 이런 경우에는 역할(책임)을 분리하라는 것이 단일 책임 원칙이다.

OCP - 개방 폐쇄 원칙

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

자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀있어야 한다. 객체 지향의 큰 장점인 유연성, 재사용성, 유지보수성을 얻기 위해서 지켜야 할 원칙이다.

LSP - 리스코프 치환 원칙

서브 타입은 언제나 자신의 기반 타입(base type)으로 교체할 수 있어야 한다.

객체지향의 상속은 다음의 조건을 만족해야 한다.

  • 하위 클래스 is kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류다.
  • 구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스 할 수 있어야 한다.

클래스들의 관계는 조직도나 계층도가 아닌 분류도가 되어야 한다!

동물 뽀로로 = new 펭귄()

동물 - 펭귄 구조(분류도)는 리스코프 치환 원칙을 만족한다.
하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 한다.

ISP - 인터페이스 분리 원칙

클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.

인터페이스를 역할에 따라 분리하되, 인터페이스 최소주의 원칙을 더해 인터페이스는 그 역할에 충실한 최소한의 기능만 공개하는 것이 좋다.
할 수 있는(~is able to)이라는 기준으로 만드는 것이 정석.

DIP - 의존 역전 원칙

고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다.
추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다.
자주 변경되는 구체(Concrete)클래스에 의존하지 마라.

자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 의존 역전 원칙이다.

상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기에 하위 클래스나 구체 클래스가 아닌 상위 클래스, 인터페이스, 추상 클래스를 통해 의존하라는 것.

profile
백엔드 개발 공부 중!

0개의 댓글