[개발] 지식/Java

객체지향의 설계원칙(SOLID)

하하미아 2023. 6. 12. 06:00

좋은 설계란 시스템에 새로운 요구사항이나 변경이 있을 때 영향을 받는 범위가 적은 구조를 의미한다. 그래서 예상치 못한 변경이 발생하더라도 유연하게 대처라히 구이해 확장성 있는 시스템 구조화가 필요하다.

SOLID 객체 지향 원칙을 적용하면 코들르 확장하고 유지 보수 관리가 쉬워지며, 불필요한 복잡성을 제거해 리팩토링에 소요되는 시간을 줄임으로써 생산성을 높일 수 있다. SOLID는 객체지향 설계 5대원칙이라고 부르며 SRP, OCP, LSP, ISP, DIP 앞글자를 따서 SOLID 원칙이라고 부른다.

  • SRP (Single Responsibility Principle) : 단일책임원칙
    • 모든 클래스는 가각 하나의 책임만 가진다. → 클래스는 그 책임을 완전히 캡슐화해야한다.
    • 하나의 클래스는 하나의 기능을 담당(하나의 책임)
  • OCP (Open Closed Principle) : 개방-폐쇄 원칙
    • 확장에는 열려있고 수정에는 닫혀있는 특징
    • 기존 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계되어야 한다.
    • 한마디로 추상화 사용을 통한 관계 구축을 권장하는 것
  • LSP (Liskov Substitution Principle) : 리스코프 치환 원칙
    • 자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 한다.
    • 자식 클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행해야 한다.
    • 다형성을 이용하기 위한 원칙
    • 업캐스팅 상태에서 동작이 의도대로 수행돼야 하므로 부모 메서드의 오버라이딩을 조심해야 함
  • ISP (Interface Segregation Principle) : 인터페이스 분리 원칙
    • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
    • 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 낫다.
    • SRP가 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조하는 것
    • 단, 한번 인터페이스를 분리하여 구성해놓고, 나중에 또 분리하는 행위는 지양
  • DIP (Dependency Inversion Principle) : 의존 역전 원칙
    • 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 변화가 없는 것에 의존해야 한다.
    • 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것 → 클래스가 아닌 인터페이스에 의존하라
    • 결합도(coupling)을 낮추는게 목적