• 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지
를 주고받고, 데이터를 처리할 수 있다. (협력)
• 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다
✔ 한 클래스는 하나의 책임(기능)만 가져야한다.
중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것
✔ 변화에 닫혀있고 확장에 열려있어야한다.
✔ 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
✔ 추상화에 의존해야지, 구체화에 의존하면 안된다.
✔특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
public interface Car{void move()}; //차 인터페이스
public class 포르쉐 implements Car; //차구현체
public class 페라리 implements Car; //차구현체
public class Driver {
private Car car=new 포르쉐();
// private Car car=new 페라리();
public void Drive(Car.move();)
.
.
}
👉이를 보고 객체지향 원리5가지가 잘지켜 졌는지 보자.
❌SRP: Driver객체내에서 car의 생성까지 책임지고 있다.
🔺OCP: Car를 페라리로 바꾸고싶을때 다형성을 이용하여 쉽게 변경이 가능하다. 하지만 Driver클래스 내부에서 변경해야한다.
🟢LSP:기존Java가 가지고있는 캡슐화,다형성이 지원 하는기능이다.
🟢ISP: 인터페이스를 여러개로 나눔으로써 해당사항을 지키고 있다.
❌DIP: 현재 Driver객체는 언뜻 Car인터페이스를 사용함 으로써 DIP원칙이 지켜지고 있는것으로 보인다. 하지만 Class내부에서 구현체를 가지고 있음으로써 지켜지고 있지않다.
public class Driver {
private Car car;
public Driver(Car car){
this.car=car;
}
public void Drive(Car.move();)
.
.
}
public AppConfig{
public Driver driver() {new Driver(porsche());}
public 포르쉐 porsche () {return 포르쉐();}
}
public void main(){
Driver driver=AppConfig.driver();
}
👉이를 보고 전의 코드와 다른점을 살펴보자.
🟢SRP: Driver입장에서 Car에 대해서는 전혀 신경쓰고 있지않다. AppConfig에서 전부 관리해준다.
🟢OCP: 내부에 있는 코드는 포르쉐를쓰든 페라리를쓰든 전혀변하지 않는다. 인터페이스만 만들어서 AppConfig에서 주입시켜주면 되기에 확장은 유연하다.
🟢DIP: Driver객체는 이제 더이상 구현체에 신경쓰지 않는다. 인터페이스에 의존하고 있다.
AppConfig를 통해서 관심사를 확실하게 분리했다. 배역, 배우를 생각해보자. AppConfig는 공연 기획자다. AppConfig는 구체 클래스를 선택한다. 배역에 맞는 담당 배우를 선택한다. 애플리케이션이 어떻게 동작해야 할지 전체 구성을 책임진다. 이제 각 배우들은 담당 기능을 실행하는 책임만 지면 된다.
👌참고자료:인프런 스프링 핵심원리(김영한)