본문 바로가기
컴퓨터과학/소프트웨어공학

SOLID 원칙

by 윤호 2021. 6. 13.

SOLID 원칙

좋은 객체지향 설계를 만들기 위한 기본 원칙들

  • SRP (단일 책임 원칙: Single Responsibility Principle)
  • OCP (개방 폐쇄의 원칙: Open Close Principle)
  • LSP (리스코프 치환 원칙: The Liskov Substitution Principle)
  • ISP (인터페이스 분리의 원칙: Interface Segregation Principle)
  • DIP (의존성 역전의 원칙: Dependency Inversion Principle)

SRP

단일 책임 원칙

  • 하나의 클래스가 하나의 기능만 가지고 있도록 설계 - 독립성
    • '하나의 변경 이유' 만을 갖도록 설계
      • "The Audience"(해당 클래스를 사용하려는 무언가) 찾기
    • 가장 기본적이지만 가장 직접 구현하기 어려운 원칙

적용 방법

  • Extract Class
    • 한 클래스 암에 이의 구조를 변경토록 하는 이유가 둘 이상 존재하는 경우
    • ex) 학생 클래스를 성적정보, 재학 정보, 등록금 납입 정보 필드를 갖도록 변경
  • Extract Superclass
    • 클래스를 나누고 보니 유사한 책임을 나눠 맡고 있는 경우 -> 상속
    • 대학생 성적정보, 대학원생 성적정보 클래스 -> 성적 정보 클래스를 상속하도록
  • Shotgun Surgery
    • 흩어진 메소드 들과 필드를 한 클래스로 합침
    • 매우 어려운 방법이고, 최후의 수단임

OCP

개방 폐쇄 원칙

  • 확장에 대해 Open
  • 변경에 대해 Close
  • 코드를 변경하지 않고 확장할 수 있도록 설계한다
    • 요구사항 변경 발생: 새 클래스를 만들어 붙이거나 상속 등을 통해 클래스 재사용
  • 변경 대상과 불변 대상을 명확히 구분
    • 변경대상과 불변 대상 사이에 인터페이스 정의
    • 구상 클래스 대신 인터페이스를 통해 코드 작성
      • strategy pattern (SRP, OCP를 만족시키는 디자인 패턴)

LSP

리스코프 치환 원칙

  • 자식 타입은 부모 타입의 정의를 위반해서는 안된다
  • 리스코프 치환: 자식 타입 클래스는 언제나 부모 타입 클래스로 바꿔 끼울 수 있어야 한다
  • 가능하다면 언제나 인터페이스를 사용해서 프로그래밍 할 것

Override 주의

  • 부모 클래스의 메소드를 override로 재정의할 때, 그 양상이 완전히 달라진다면
    • 인터페이스를 이용해야 했거나
    • 사실은 부모-자식 사이가 아니었거나

ISP

인터페이스 분리의 원칙

  • 자신이 사용하지 않을 인터페이스는 구현하지 말 것
    • 응집성과 연관
  • 하나의 일반적인 인터페이스 보다는, 여러개의 구체적인 인터페이스가 좋음
    • 인터페이스의 단일 책임
    • Animal 인터페이스 보다는 Barkable, Walkable, Eatable 인터페이스 권장

적용 방법

  • 클래스 상속을 통한 인터페이스 분리
  • 상속 대신 위임을 사용
    • Facade Pattern

DIP

의존성 역전의 원칙

  • 하위(Calle)가 상위(Caller)에 의존해야 함
  • 하위 모듈이 상위 모듈의 변경을 요구해서는 안됨

좋은 설계 훈련하기

평소 설계할 때 좋은 설계를 생각하는 훈련을 하지 않으면 절대 늘지 않음


reference

  • 상명대학교 한종대교수님 소프트웨어공학 수업

댓글