그럼 객체 지향의 특징이 뭔데?
객체지향에는 4가지가 있다.
객체들의 모임 + 객체는 데이터를 주고받고 처리할 수 있음
컴퓨터 부품 갈아 끼우듯, 키보드,마우스를 갈아 끼우듯
컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
=> 다형성 (Polymorphism)

운전자 - 자동차
->
역할과 구현으로 구분하면 클라이언트는
꼭 인터페이스가 아니고, 일반 상속관계도 다형성이 가능하다.
가급적이면 인터페이스를 하는 게 나음
핵심은 구현보다 인터페이스가 먼저이다.


MemberService가 인터페이스 MemberRepository의 save()를 호출
누가 호출될까?
MemoryMemberRepository가 들어있으면 이 레파지토리의 save()가 호출
JdbcMemberRepository가 들어있으면 이 레파지토리의 save()가 호출
=> 오버라이딩
다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있는 것이
java 언어가 가진 다형성의 장점

MemberService가 클라이언트이다. MemberRepository에 의존한다. MemberService는 MemberRepository를 알고있다. MemberRespository에 이 인터페이스를 구현한 MemoryMemberRepository와 JdbcMemberRepository를 할당할 수 있을까?public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
MemberService가 인터페이스 MemberRepository 를 선언new MemoryMemberRepository() 로 값 대입public class MemberService {
//private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
new JdbcMemberRepository() 로도 값을 대입할 수 있다. 
반대로, 인터페이스 MemberRepository or 부모 클래스와는 관계없는 클래스는 할당할 수 없다.

MemberService가 바라보는 인터페이스 MemberRepository의 save()를 MemoryMemberRepository의 save() 일 수도 있고 JdbcMemberRepository의 save() 일 수도 있다. MemoryMemberRepository가 아닌 JdbMemberRepository로 바꿔도 MemoryMemberRepository에는 영향이 없음 SRP : 단일 책임 원칙 (Single Responsibl)
OCP : 개방-폐쇄 원칙 (Open/Closed Principle)
public class MemberService {
//private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}MemoryMemberRepository가 아닌, JdbcMemberRepository로 바꾸고 싶음 MemberService의 코드를 바꿔야 함. (Memory...를 주석처리하고 Jdbc..로 변경)LSP : 리스코프 치환 원칙 (Liskov Substitution Principle)
ISP : 인터페이스 분리 원칙 (Interface Segregation Principle)
DIP : 의존관계 역전 원칙 (Dependency Inversion Principle)
MemberService는 인터페이스에 의존하지만, 구현 클래스도 동시에 의존함 (의존 = 내가 저 코드를 알아)MemberService 클라이언트가 구현 클래스를 직접 선택한다. MemberRepository), 구체화에에도 의존(MemoryMemberRepository)MemberService는 MemberRepository 인터페이스에만 의존하도록 설계해야 한다.