상세 컨텐츠

본문 제목

[객체 지향 프로그래밍] 소프트웨어 설계를 위한 다섯 가지 기본 원칙 : SOLID 원칙

server

by 셉인 2024. 4. 4. 13:31

본문

728x90

[객체 지향 프로그래밍] 소프트웨어 설계를 위한 다섯 가지 기본 원칙 : SOLID 원칙

SOLID 원칙은 객체 지향 프로그래밍과 디자인에서 효과적인 소프트웨어 설계를 위한 다섯 가지 기본 원칙. 이 원칙들은 소프트웨어를 더 유연하고, 유지보수가 쉽고, 확장 가능하게 만드는 데 도움을 준다. 

1. 단일 책임 원칙 (Single Responsibility Principle, SRP)

  • 정의: 한 클래스는 하나의 책임(기능 담당)만 가져야 한다. 즉, 하나의 클래스는 하나의 기능만을 담당하여 하나의 책임을 수행하는데 집중되도록 클래스를 따로따로 여러개 설계하는 원칙
  • 목적: 클래스가 변경되어야 하는 이유는 오직 하나뿐이어야 한다. 이 원칙은 클래스의 복잡성을 줄이고, 시스템의 유지보수성을 향상시킨다.

2. 개방-폐쇄 원칙 (Open/Closed Principle, OCP)

  • 정의: 소프트웨어의 구성요소(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하지만 변경에는 닫혀 있어야 한다.
    • 기능 추가 요청이 오면 클래스를 확장을 통해 손쉽게 구현하면서, 확장에 따른 클래스 수정은 최소화
    • 확장에 열려있다 : 새로운 변경 사항이 발생했을 때 유연하게 코드를 추가함으로써 애플리케이션의 기능 확장
    • 변경에 닫혀있다 : 새로운 변경 사항이 발생했을 때 객체 직접적으로 수정을 제한
  • 목적: 기존의 코드를 변경하지 않고도 시스템의 기능을 확장할 수 있어야 한다. 추상화 사용을 통한 관계 구축을 권장하며, 다형성과 확장을 통해 객체 지향의 장점을 극대화한다. 이는 재사용성과 유지보수성을 높인다.

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

  • 정의: 프로그램의 객체는 프로그램의 정확성을 변경시키지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 즉, 자식 타입은 언제나 부모 타입으로 교체할 수 있어야 한다. 다형성 원리를 이용하기 위한 원칙 개념
  • 목적: 하위 클래스는 그것들의 기반 클래스와 대체 가능해야 한다. 또한, 부모 메서드의 오버라이딩을 주의해야한다. 이 원칙은 상속의 올바른 사용을 강조한다.

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

  • 정의: 인터페이스를 사용에 맞게 잘게 분리해 설계하는 원칙. 사용하지 않는 인터페이스는 클라이언트에게 강제되어서는 안 된다. 
  • 목적: 클라이언트는 그들이 사용하지 않는 메서드에 의존하게 만들어서는 안되며, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공한다. 인터페이스를 작고, 구체적으로 유지하여 시스템의 유연성을 높인다.
  • 주의 : 한 번 인터페이스를 분리하여 구성한 뒤 수정사항이 생겨도 분리해서는 안된다. (인터페이스는 한 번 구성했다면, 변하면 안되는 정책 개념.) 해당 인터페이스를 구현하거나 사용하는 모든 클래스에 영향을 미치게 되기 때문이다.

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

  • 정의: Class를 직접 참조하는 것이 아니라 대상의 상위 요소 (추상 클래스 혹은 인터페이스)를 참조해야 한다. 둘 다 추상화에 의존해야 한다. 구현 클래스에 의존하는 것이 아닌, 인터페이스에 의존해야 한다.
  • 목적: 의존성을 추상화에 맞춤으로써 모듈 간의 결합도를 줄이고, 시스템의 유연성과 확장성을 향상시킨다. 자주 변화가 없는 것에 의존하도록 한다.
728x90

'server' 카테고리의 다른 글

[Spring/Java] Java record  (0) 2024.04.04
[Spring/Java] 스프링의 의존성 주입 방식 (DI)  (0) 2024.04.04
[Java] super, super() 키워드 차이  (1) 2024.04.04
[Java] final, static, static final  (0) 2024.04.04
[Java] Java의 Generic 타입  (0) 2024.04.03

관련글 더보기

댓글 영역