로버트 마틴의 좋은 객체 지향설계의 5가지 원칙의 앞 글자를 따서 만든 용어
시스템에 새로운 기능이 확장되거나 변경사항이 있는 경우 기존 기능들이 영향을 적게 받는 것이 좋은 설계
1. SRP(Single Responsibility principle), 단일 책임 원칙
- 한개의 클래스는 하나의 책임(기능)만을 가진다
- 객체가 하나의 책임을 가진다는 것은 새로운 기능이 확장되거나 변경사항이 있는 경우 파급효과가 적다면 하나의 책임을 가지고 있는 것
2. OCP(Open/Closed Principle), 개방 폐쇄 원칙
- 기존의 코드를 변경하지 않고(Closed) 확장(Open)할 수 있다.
- 인터페이스 안에 필요 기능을 작성한다면 인터페이스를 구현하는 구현클래스는 다형성을 통해서 새로운 기능의 확장이 가능하다.
3. LSP(Liskov substitution principle), 리스코프 치환 원칙
- 클래스를 상속하는 자식 클래스들은 부모 클래스의 규약을 지켜야한다.
- 부모클래스를 상속하는 자식클래스는 부모 클래스의 규약을 무시하거나 오버라이딩을 자제해야하는 것이 LSP이다
4. ISP (Interface Segregation principle), 인터페이스 분리 원칙
한 클래스에 기능을 전부 정의하는 것보다는
interface People {
public void cook(); //요리하기
public void cleaning(); //청소하기
public void work(); //작업하기
public void submit(); //제출하기
}
특정 클래스의 인터페이스로 분리 해주는것이 더 좋은 객체 지향설계이다
//주부 인터페이스
interface Housewife {
public void cook();
public void cleaning();
}
//직장인 인터페이스
interface Worker {
public void work();
public void submit();
}
5. DIP(Dependency inversion principle), 의존 관계 역전 원칙
- 구현체보다는 인터페이스나 추상 클래스에 의존하는 것이 좋다.
- 클라이언트가 기능을 이용할 때 인터페이스의 기능만 알고 그 안을 구현하는 구현체에 대해서는 몰라도되는 것과 비슷한 원리이다.
- Spring Framework는 스프링이 지원하는 의존성 주입 (DI,Dependency Injection)과 DI 컨테이너를 이용해 자바 객체의 의존성을 연동해준다.