Spring

좋은 객체 지향 설계란

@xftg77g 2022. 3. 24. 03:24

좋은 객체 지향 설계의 목표는 프로그램이 유연하고 변경이 용이하게 설계하는 것이라고 생각한다. 유연하고 변경에 용이하다는 것은 무슨 소리일까? 우리 실생활을 예로 들어본다면 면허, 자동차, 그리고 특정 자동차를 예로 들 수 있다.

 

우리가 차를 몰기 위해서 면허를 땄다고 하자. 그럼 면허 종류에 맞는 모든 자동차를 운전할 수 있다. 자동차가 바뀐다고 해서 면허를 다시 따야 하는가? 그렇지 않다.. 내 자동차가 특정 자동차로 바뀌어도 문제가 없어야 한다.

 

즉 면허는 자동차라는 추상화에 의존하고 특정 자동차에 의존하지 않는다는 소리이다.

객체 지향 설계의 목표도 이와 유사하다. 클라이언트 코드는 추상화된 코드에 의존해야 하고 구현체에는 의존하지 않아야 한다는 중요한 원칙을 가지고 있다. 그리고 이 원칙을 다형성이라는 단어로 축약해서 표현한다.

 

다형성에 대해서 조금 더 알아보자. 우리가 면허를 땄을 때 자동차의 보편적인 사용 방법을 익힌 상태이기 때문에 자동차의 브랜드가 바뀐다고 해도 문제 될 것이 없을뿐더러 네비게이션, 터치 디스플레이, 기어봉이 바뀐다고 한들 사용에 문제가 없을 것이다. (조금은 어색하겠지만)

 

즉, 우리는 자동차의 역할 그리고 보편적인 사용 방법만 알면 되는 것이지 특정 자동차의 변경 사항을 알아야할 필요가 없는 것이다. 이것을 바로 역할(자동차의 보편적인 사용 법)과 구현(특정 브랜드 자동차)이 잘 분리된 것이라고 말할 수 있다.

자바 언어에서는 이렇게 역할과 구현을 잘 분리하기 위해서 역할은 인터페이스, 구현은 인터페이스를 구현한 구현 객체로 분리한다. 설계의 순서는 당연히 역할의 설계가 먼저고 그 역할을 수행하는 구현 객체를 구현하는 것이 다음이다.

 


음 벌써 다형성이라는 것에 대해서 다 알아버린 것 같다. (물론 착각이다)

일단 지금까지 얘기해 본 다형성에 대해서 간단하게 정리해보자면,

  • 인터페이스를 구현한 구현 객체를 유연하게 변경할 수 있어야 한다.
  • 클라이언트는 변경사항에 영향을 받으면 안된다.

 

그럼 한계점은 뭐가 있을까?

  • 구현이 아닌 역할이 변경되면 대참사가 발생한다. (앞으로 자동차는 날 수 있어야 합니다 같은...)
  • 인터페이스를 처음에 아주 '잘' 설계해야 한다.
  • 실무에서는... 인터페이스를 도입하면 추상화라는 비용이 발생한다.
    • 추후 리팩터링 하는 것도 하나의 방법이라고 한다.

오늘 글을 통해서 한 가지 확실한 것은 다형성이란 것이 가장 중요해 보인다는 것이다. 그리고 역할과 구현을 철저히 분리하면 우리는 객체 지향 원칙을 잘 지킬 수 있을 것 같다는 생각이 든다. (물론 착각이다)

 

다음 포스팅에서는 객체 지향 원칙을 더 잘 지킬 수 있는 코드에 대해서 고민해보았다.

https://braindisk.tistory.com/26

 

객체 지향 설계 원칙을 잘 지키는 법

이전 포스팅에서 좋은 객체 지향 설계란 무엇인가 생각해보았다. https://braindisk.tistory.com/25 좋은 객체 지향 설계란 좋은 객체 지향 설계의 목표는 프로그램이 유연하고 변경이 용이하게 설계하는

braindisk.tistory.com

 


reference

https://www.inflearn.com/course/스프링-핵심-원리-기본편/

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com