Life style/TIL

[TIL] SOLID 객체 지향설계

jaewpark 2022. 12. 12. 13:22

클린 코드 책으로 유명한 베스트셀러이자 프로그래머인 로버트 마틴(Robert Cecil Martin)이 2000년도 초반에 SOLID 원칙에 대해서 논문을 통해 SOLID 원칙을 이야기 했으며, 이러한 개념을 SOLID 약어로 소개한 마이클 페더스로 인해서 구축되어졌다.

 

SOLID가 무엇인가❓

  • Single Responsibility (단일 책임) 
  • Open/Closed (개방/폐쇄)
  • Liskov Substitution (리스코프 치환)
  • Interface Segregation (인터페이스 분리)
  • Dependency Inversion (의존성 역전)

 

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

이름에서 알 수 있듯이 클래스가 하나의 책임을 가져야 하며 변경의 이유도 하나여야만 합니다.

단일 책임으로 인한 이점은?

  • 더 적은 테스트 사례
  • 기능이 적어져서 종속성이 적어지며, 낮은 결합성
  • 작고 잘 조직된 클래스는 monolithic보다 쉬운 검색

 

OCP (개방-폐쇄의 원칙, Open-Close-Principle)

클래스는 확장에는 열려있어야 하며 수정은 닫혀 있어야 합니다.

기존에 코드의 수정은 버그 가능성이 있지만, 잠재적인 새로운 버그 발생을 방지하는 역할

기존의 코드를 건드리지 않고 클래스를 확장하여 사용

 

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

자식클래스는 부모 클래스로써의 역할을 완벽히 할 수 있어야 합니다

 

좀 더 쉬운 이해를 위해 아래 그림같이 보도록 하겠습니다. 은행 애플리케이션에는 두 가지 계정 유형을 가지고 있습니다.

하지만 새로운 유형이 도입될 때마다 은행 서비스를 변경해야합니다.

출처 : https://www.baeldung.com/java-liskov-substitution-principle

이를 개선하기 위해 재설계를 하여 아래와 같이 수정을 하면, 확장에 대해서 열려있으면서 수정에 대해서는 닫혀 있는 구조가 됩니다.

은행 서비스는 더이상 구체적인 계정 클래스에 의존하지 않게 되어 새로운 유형이 도입되더라도 변경할 필요가 없게 됩니다.

출처 : https://www.baeldung.com/java-liskov-substitution-principle

 

좀 더 쉬운 이해를 위한 사이트
참고 사이트
참고 사이트

 

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

ISP는 더 큰 인터페이스를 더 작은 인터페이스로 분할해야 함을 의미합니다. 

불필요한 인터페이스를 사용하려 상속받은 메서드를 퇴화시키거나 불필요한 빌드를 하게 됩니다.

 

DIP(의존성 역전의 원칙, Dependency Inversion Principle)

소프트웨어 모듈의 분리를 의미합니다. 이렇게 하면 하위 수준 모듈에 의존하는 상위 수준 모듈 대신 둘 다 추상화에 의존합니다

// 잘못된 선택
class macOSVentra {
    let keyboard: Keyboard
    let monitor: Monitor
    
    init() {
    	monitor = Monitor()
        keyboard = Keyboard()
    }
}

// 의존성 역전의 원칙을 적용
class macOSVentra {
    let keyboard: Keyboard
    let monitor: Monitor
    
    init(monitor: Monitor, keyboard: Keyboard) {
    	monitor = monitor
        keyboard = keyboard
    }
}