학부에서 1년동안 파이썬과 AI모델 관련한 것들만 하다보니 잊은 지 오래된 단어다.
물론 최근에 기사 자격증을 준비하며 기초적인 내용을 다시 보기는 했으나 기억이 가물가물해지긴 했다. 이번에 덮어놨던 스프링 강의를 다시보게 되면서, 기억도 잘 안나는 자바를 하게됐으니, 겸사겸사 객체지향개발에 대해 공부하는 기회를 가지게 되었다.
흔히 클래스를 처음 배울때 가장 먼저 설명하는 것이 상속을 통한 구현이다.
예를 들어 자동차 클래스를 상속받아 다양한 자동차들, 아반떼, 그랜져 클래스 등등을 만들 수 있다는 것이다. 나도 그랬고, 대부분의 학생들은 여러개의 클래스를 쉽게 구현할 수 있게 되는 것에 집중한다. 하지만 개발자 입장에서의 본질은 그게 아니라, 동일한 사용법으로 여러 개의 클래스를 사용할 수 있다는 것이다. 새로운 클래스를 만들더라도, 이를 사용하는 클라이언트의 코드는 변경할 필요가 없다는 것. 그것이 가져다주는 장점을 생각해보니 단순히 여러 개의 클래스를 구현할 수 있다는 것보다 훨씬 중요하다고 생각하게 되었다.
-> 인터페이스를 구현한 객체를 실행시점에 변경할 할 수 있다
-> 따라서 클라이언트를 변경하지 않으면서 구현기능을 유연하게 변경할 수 있다.
단순히 단일책임이라는 것은 모호함; 책임의 크기, 범위가 다르기 때문.
중요한 것은 변경. 어떤 변경을 해야만 할 때 그 파급효과가 얼마나 큰지를 따져야 함
다형성을 통해 편리한 확장(ex. 인터페이스로 부터 새로운 기능의 클래스를 구현)
하지만 정확한 설계를 통해 핵심은 변경되지 않도록.
--> 그런데 사용하는 클래스를 바꾸려면, 클라이언트의 코드를 변경?
--> 이를 위해 별도의 연결고리가 필요 : 스프링의 컨테이너 기능?
하위클래스는 인터페이스 규약을 꼭 지켜야 한다는 것.
단순히 메소드를 다 구현해서 컴파일이 되는 것을 넘어서, 같은 기능을 수행하도록.
단일책임과 비슷. 여러개의 인터페이스(특정 기능만 수행하는)를 통한 구현
-> 작은 여러개의 인터페이스 --> 명확성, 대체가능성 UP
추상화에 의존해야한다. 구체화에 의존하면 안된다.
즉, 클라이언트가 클래스에 의존하는 것이 아니라 인터페이스에 의존해야 한다.
구현체에 의존하게 되면 수정이 힘들어짐.
--> 하지만 사용할 객체를 클라이언트가 직접 선택하는 순간 의존하는 것과 마찬가지
DI 컨테이너 를 통해 위에서 말한 OCP와 DIP 위배를 막는다.
-> 더욱 유연한, 특히 클라이언트의 변경없이 확장이 가능하게 함.