SRP, 단일 책임의 원칙

  • 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 함
  • 하나의 클래스는 하나의 책임만을 가지고 있어야 함

OCP, 개방 폐쇄의 원칙

  • 프로그램의 확장에 있어서는 개방되어 있어야 하지만, 변경에 있어서는 닫혀있어야 함
  • 프로그램에 새로운 기능이 추가될 때, 기존의 코드가 수정되지 않아야 함

LSP, 리스코프 교체 원칙

  • 모든 서브 클래스의 객체는 그 기반 클래스(부모클래스)의 객체와 교체되어도 프로그램에 이상이 없어야 함
  • 사용자는 파생 클래스에 대해서 알 필요가 없어야 함 - instanceof나 다운캐스트를 사용하여 파생클래스에 대한 처리를 해주면 안된다는 뜻 - OCP와도 밀접한 관련 - 새로운 클래스가 추가되면 Client 코드에서 수정이 필요하기 때문에 위배

DIP, 의존관계 역전 원칙

  • 의존관계를 맺을 때, 구체적인 것에 의존하지 않고 추상적인 것에 의존해야 함
  • 구체적인 것은 자주 변하기 때문에 변화가 적은 추상화된 것에 의존하는 것이 좋음
  • 추상 클래스나 인터페이스에 의존
  • OCP와 밀접한 관련이 있음 - 구체적인 것에 의존하면 클래스가 변경되면 기존의 코드를 변경해야 될수도 있음. 이는 변경에 닫혀있지 않게 때문에 OCP를 위배하게 됨

ISP, 인터페이스 격리 원칙

  • 사용자는 자신이 사용하지 않는 메서드에 의존관계를 맺으면 안 됨
  • 어떤 객체에서 사용하지 않는 메서드는 그 객체에 포함되게 하지 않는 것 - 자신이 사용하지 않는 메서드에 의존해서는 안 됨
  • ISP가 지켜지면 SRP또한 만족되지만, SRP가 지켜진다고 해서 ISP가 지켜지는 것은 아님

    예시 )
    게시판의 기능을 구현한 메서드를 가지고 있는 클래스를 보면, 글쓰기, 읽기, 수정, 삭제를 위한 메서드가 있다고 하자.이를 사용하는 사용자들 중에서 모든 기능을 사용하는 사용자도 존재하지만 읽기 기능만 사용하는 사용자들도 존재한다.
    이는 게시판에 관련된 책임을 수행하기 때문에 SRP는 만족하지만, 클라이언트에 상관없이 인터페이스가 사용되므로 ISP는 만족되지 않는다.