Single Responsibility Principle: 단일 책임 원칙

  • 응집도에 대한 기준
  • “각 소프트웨어 모듈은 변경의 이유가 단 하나여야만 한다” == “하나의 모듈은 오직 하나의 액터에 대해서만 책임져야 한다”
  • 1974년 다익스트라에 의해 제안된 개념인 관심사의 분리의 다른 표현
  • 하나의 클래스가 하나의 일만 해야 한다는 뜻이 아님에 유의(메소드는 그래야 함)

Open-Closed Principle: 개방-폐쇄 원칙

  • “소프트웨어 모듈은 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다”
  • 열려 있다: 데이터 구조에 필드를 추가하거나, 함수에 새로운 요소를 추가하는 것이 가능해야 함
  • 닫혀 있다: 내부 코드를 변경해도 이를 사용하는 외부 모듈에는 영향을 미치지 않아야 함
  • 멤버 변수를 private / protected로 선언: 내부 데이터의 변경이 클래스 사용자에게 의도치 않은 영향을 주지 않도록
  • 글로벌 변수 피하기: 글로벌 변수를 참조하는 모듈이나 클래스가 외부 값에 의존하게 되면 예기치 못한 변경이 생겨 폐쇄 원칙이 깨질 수 있음
  • 추상 클래스를 따로 만들기: 사용자에게 필요한 것만 노출함으로 폐쇄 원칙을 만족하고, 구현 클래스의 내용을 감춤으로 수정도 용이

Liskov Substitution Principle: 리스코프 치환 원칙

  • “대체 가능한 컴포넌트들을 이용해 시스템을 만들 수 있으려면, 이들의 서브 타입들은 반드시 서로 치환 가능해야 한다”
  • ex) 상속

Interface Segregation Principle: 인터페이스 분리 원칙

  • “각 소프트웨어 모듈은 자신이 사용하지 않는 것에 의존하지 않아야 한다”
  • 모듈 단위의 인터페이스 분리 원칙
    • 외부 모듈에 필요한 “인터페이스”만 노출한다

Dependency Inversion Principle: 의존성 역전 원칙

  • “높은 수준의 코드는 낮은 수준의 세부 사항 구현에 절대로 의존해서는 안 되며, 그 반대여야 한다.”