객체 지향 프로그래밍 이란?
대규모 프로젝트를 할 때, 컴퓨터 프로그램들을 객체로 보아, 객체들이 모여 서로의 정보를 주고 받음으로서 개발을 유연하게 만들어준다.
운전자는 자동차라는 인터페이스만 제대로 알고 있으면, 현대 자동차, 기아 자동차 등 자유롭게 사용할 수 있다.
-> 운전자에게 영향을 주지 않는다.
현대 자동차의 내부 구조를 몰라도 자동차만 알면 사용할 수 있다.
클라이언트는 인터페이스만 제대로 알고 있으면(의존하고 있으면), 그것에서 파생된 구현 클래스들은 자유롭게 사용할 수 있다.
-> 클라이언트에게 영향을 주지 않는다.
구현 클래스의 내부 구조를 몰라도 인터페이스만 알면 사용할 수 있다.
이 원리를 이용한 것이 자바 언어
인터페이스를 변경없도록 잘 설계하는것이 매우 중요하다.
웹 개발할 때, Spring을 왜 사용하는가?
Spring은 자바를 기반으로 사용할 수 있는데, 객체 지향 프로그래밍을 극대화할 수 있게 도와준다. IoC, dI를 통해 "도와준다."
- Single responsibility principle (SRP) : 단일 책임 원칙
변경이 있을 때 파급 효과가 적도록 되도록 하나의 클래스는 하나의 책임만 가져야 한다.
- (중요) Open/closed principle (OCP) : 인터페이스의 다형성처럼 확장에는 열려있고, 변경에는 닫혀있어야 한다.
-> 하지만 자바에서는 클라이언트의 코드를 건드려야지만 구현 클래스를 바꿔 끼울 수 있다. 이 문제를 도와주는 것이 Spring의 dI와 IoC이다.
- Liskov substitution principle (LSP 리크코프 치환 원칙) : 컴파일이 된다고 원칙을 지킨 것이 아니다. 자동차 엑셀을 실행시켰을 때 값이 마이너스로 떨어지면 안되는 것처럼 규약을 지켜주어야 한다.
- Interface segregation principle (ISP 인터페이스 분리 원칙) : 역할을 좀 더 전문적으로 여러개의 인터페이스로 분리하면, 그것에 맞는 클라이언트도 분리된다.
- (중요) Dependency inversion principle (DIP 의존관계 역전 원칙) : 클라이언트는 추상화(인터페이스)에 의존하고, 구체화(구현 클래스)에 의존하면 안된다.
다형성만으로는 OCP, DIP를 지킬 수 없다. 해결 방법은?
** 의존 : 그 객체를 알고있어서 사용하고 있는 것