좋은 객체 지향 설계의 목표는 프로그램이 유연하고 변경이 용이하게 설계하는 것이라고 생각한다. 유연하고 변경에 용이하다는 것은 무슨 소리일까? 우리 실생활을 예로 들어본다면 면허, 자동차, 그리고 특정 자동차를 예로 들 수 있다.
우리가 차를 몰기 위해서 면허를 땄다고 하자. 그럼 면허 종류에 맞는 모든 자동차를 운전할 수 있다. 자동차가 바뀐다고 해서 면허를 다시 따야 하는가? 그렇지 않다.. 내 자동차가 특정 자동차로 바뀌어도 문제가 없어야 한다.
즉 면허는 자동차라는 추상화에 의존하고 특정 자동차에 의존하지 않는다는 소리이다.
객체 지향 설계의 목표도 이와 유사하다. 클라이언트 코드는 추상화된 코드에 의존해야 하고 구현체에는 의존하지 않아야 한다는 중요한 원칙을 가지고 있다. 그리고 이 원칙을 다형성이라는 단어로 축약해서 표현한다.
다형성에 대해서 조금 더 알아보자. 우리가 면허를 땄을 때 자동차의 보편적인 사용 방법을 익힌 상태이기 때문에 자동차의 브랜드가 바뀐다고 해도 문제 될 것이 없을뿐더러 네비게이션, 터치 디스플레이, 기어봉이 바뀐다고 한들 사용에 문제가 없을 것이다. (조금은 어색하겠지만)
즉, 우리는 자동차의 역할 그리고 보편적인 사용 방법만 알면 되는 것이지 특정 자동차의 변경 사항을 알아야할 필요가 없는 것이다. 이것을 바로 역할(자동차의 보편적인 사용 법)과 구현(특정 브랜드 자동차)이 잘 분리된 것이라고 말할 수 있다.
자바 언어에서는 이렇게 역할과 구현을 잘 분리하기 위해서 역할은 인터페이스, 구현은 인터페이스를 구현한 구현 객체로 분리한다. 설계의 순서는 당연히 역할의 설계가 먼저고 그 역할을 수행하는 구현 객체를 구현하는 것이 다음이다.
음 벌써 다형성이라는 것에 대해서 다 알아버린 것 같다. (물론 착각이다)
일단 지금까지 얘기해 본 다형성에 대해서 간단하게 정리해보자면,
- 인터페이스를 구현한 구현 객체를 유연하게 변경할 수 있어야 한다.
- 클라이언트는 변경사항에 영향을 받으면 안된다.
그럼 한계점은 뭐가 있을까?
- 구현이 아닌 역할이 변경되면 대참사가 발생한다. (앞으로 자동차는 날 수 있어야 합니다 같은...)
- 인터페이스를 처음에 아주 '잘' 설계해야 한다.
- 실무에서는... 인터페이스를 도입하면 추상화라는 비용이 발생한다.
- 추후 리팩터링 하는 것도 하나의 방법이라고 한다.
오늘 글을 통해서 한 가지 확실한 것은 다형성이란 것이 가장 중요해 보인다는 것이다. 그리고 역할과 구현을 철저히 분리하면 우리는 객체 지향 원칙을 잘 지킬 수 있을 것 같다는 생각이 든다. (물론 착각이다)
다음 포스팅에서는 객체 지향 원칙을 더 잘 지킬 수 있는 코드에 대해서 고민해보았다.
https://braindisk.tistory.com/26
reference
https://www.inflearn.com/course/스프링-핵심-원리-기본편/
'Spring' 카테고리의 다른 글
스프링 컴포넌트 스캔 (0) | 2022.04.03 |
---|---|
싱글톤의 단점과 스프링의 싱글톤 컨테이너 (0) | 2022.04.03 |
POJO에서 스프링으로의 전환 (0) | 2022.03.26 |
IoC (0) | 2022.03.25 |
객체 지향 설계 원칙을 잘 지키는 법 (0) | 2022.03.24 |