객체 지향 특징
: 추상화, 캡슐화, 상속, 다형성
다형성(polymorphism)
: 참조 타입의 변수가 가리키는 실제 객체의 클래스에 따라 그것에 맞는 메소드가 호출된다는 것을 의미
- 객체 지향의 핵심은 다형성
- 역할과 구현을 분리
- 자바 언어의 다형성을 활용 (오버라이딩)
- 역할 = 인터페이스, 구현 = 인터페이스를 구현한 클래스, 구현 객체
- 객체 설계 시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
1. SRP(single responsibility principle) : 단일 책임 원칙
- 클래스는 응집성이 높아야 한다.
- 한 클래스는 하나의 책임만 가져야 한다.
2. OCP(Open/closed principle) : 개방-폐쇄 원칙
- 코드 수정 없이 확장이 가능해야 한다. (확장에는 열려 있고, 변경에는 닫혀 있어야 한다.)
- 다형성을 활용
- 역할(인터페이스)과 구현(구현 클래스, 구현 객체)을 분리
- 유연하고 변경에 용이하다.
- 확장 가능한 설계
- 클라이언트에 영향을 주지 않고 변경이 가능한다.
- 역할(인터페이스)과 구현(구현 클래스, 구현 객체)을 분리
3. LSP(Liskov substitution principle) : 리스코프 치환 원칙
- 상위 타입은 하위 타입의 인스턴스로 교체가 가능해야 한다.
- 다형성에서 하위 클래스는 인터페이스 규약을 모두 지켜야 한다.
4. ISP(Interface segregation principle) : 인터페이스 분리 법칙
- 필요 없는 것을 구현하도록 강요하지 않아야 한다.
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 인터페이스가 명확해지고, 대체 가능성이 높아진다.
5. DIP(Dependency inversion principle) : 의존관계 역전 원칙
- 클래스는 구체적 클래스 대신에 상위 추상 타입이나 인터페이스에 의존해야 한다.
- 역할에 의존해야 한다.
- DI(Dependency Injection) : 관계 주입, 의존성 주입, 의존 관계
- 관계를 고정하는 것이 아니라 사용하는 측에서 관계를 동적으로 맺어주는 방식
- 생성자 관계 주입 방식, setter를 이용하는 방식
- 관계를 고정하는 것이 아니라 사용하는 측에서 관계를 동적으로 맺어주는 방식