[CS] SOLID 원칙

해니·2023년 9월 6일
0

CS

목록 보기
6/15
post-thumbnail





SOLID란?

  • 로버트 마틴이 2000년대 초에 명명한 객체 지향 프로그래밍의 다섯 가지 기본 원칙을 마이클 페더스가 원칙의 앞 글자를 따서 다시 SOLID라는 이름으로 소개함
  • 변경에 유연한 아키텍트, 이해하기 쉬운 아키텍트, 많은 소프트웨어 시스템에 사용될 수 있는 컴포넌트 기반의 아키텍트를 추구한다



SRP (Single Responsibility)

단일 책임 원칙

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

  • 클래스를 변경하는 이유는 단 하나여야 한다
  • 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미치면 안 된다

💡 클래스가 지는 책임이란?

  • 한 클래스가 수행할 수 있는 기능을 의미함
  • 한 클래스의 기능 (책임)이 여러 개라면, 클래스 내부의 함수끼리 강한 결합을 발생할 가능성이 높아진다
    • 응집도는 높고 결합도는 낮은 프로그램을 설계하는 것이 객체 지향 설계의 핵심이므로, 기능이 여러개인 것은 이에 위반된다

💻 SRP 원칙을 적용하면?

  • 객체가 담당하는 기능, 즉 책임이 많아질 수록 그 객체의 변경에 따른 영향도의 양과 범위가 매우 커지게 된다
  • SRP를 코드에 적용하면, 책임 영역이 확실해져 한 책임의 변경에서 다른 책임의 변경의 연쇄작용에서 자유로울 수 있다. 즉, 코드의 의존성과 결합도를 줄일 수 있다.




OCP (Open-Closed)

개방-폐쇄 원칙

"확장에는 열려(open)있어야 하고, 변경에는 닫혀(closed) 있어야 한다"

  • 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다는 뜻을 가지는 원칙
    • 추상화 (인터페이스)상속 (다형성) 등을 통해 구현해낼 수 있다
    • 자주 변화하는 부분을 추상화함으로써 기존 코드를 수정하지 않고도 기능을 확장할 수 있도록 함으로써 유연함을 높인다
ex) 캐릭터 하나를 생성한다고 할 때 각 캐릭터마다 움직임이 다를 경우, 움직임 패턴 구현을 하위 클래스에 맡긴다면 캐릭터 클래스의 수정은 필요없고(Closed), 움직임 패턴만 재정의 하면 된다.(Open)



💡 추상화

  • 객체의 공통적인 속성과 기능을 추출하여 정의하는것
  • 역할과 구현의 분리
    • 객체들의 공통적인 기능 추출하여 인터페이스에 정의한다.
    • 객체 지향적 설계에 있어서 인터페이스는 어떤 객체의 역할만을 정의하여 객체들 간의 관계를 보다 유연하게 연결하는 역할을 담당한다.
    • 인터페이스에는 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계하는 것을 의미한다.







LSP (Liskov Substitution)

리스코프 치환 원칙

"서브 타입은 언제나 자신의 기반 타입으로 변경할 수 있어야 한다."

  • 부모 객체와 이를 상속한 자식 객체가 있을 때, 부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체할 수 있다는 원칙
  • 올바른 상속을 위해 자식 객체의 확장이 부모 객체의 방향을 온전히 따르도록 권고하는 원칙
  • 가급적 부모 객체의 일반 메소드를 그 의도와 다르게 오버라이딩 하지 않는 것이 중요하다



ISP (Interface Segregation)

인터페이스 분리 원칙

"하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스가 낫다."

  • 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
  • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다
  • 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 한다
    -> 각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 한다



DIP (Dependency Inversion)

의존 관계 역전 원칙

"구체적인 것이 추상화된 것에 의존해야 한다. 자주 변경되는 구체 클래스에 의존하지마라."

  • 의존 관계를 맺을 때, 변하기 쉬운 것 (구체적인 것) 보다는 변하기 어려운 것 (추상적인 것)에
    의존
    해야 함 -> 구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다는 뜻





출처
SOLID 원칙
[Java] 객체지향 설계 원칙 SOLID 알아보기
SOLID 원칙, 어렵지 않다!
[OOP] 객체지향 프로그래밍의 5가지 설계 원칙, 실무 코드로 살펴보는 SOLID
완벽하게 이해하는 LSP (리스코프 치환 원칙)
[OOP] 객체지향 5대 원칙(SOLID) - 단일 책임 원칙(SRP)
SOLID 원칙 - (2) 개방 폐쇄 원칙 (OCP)
객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화

profile
💻 ⚾️ 🐻

0개의 댓글