지난 포스트에서 스프링은 객체 지향 어플리케이션의 개발을 돕는, 좋은 객체 지향 프로그래밍을 할 수 있도록 돕는 프레임워크라고 하였다.
그렇다면 좋은 객체 지향 프로그래밍이란 무엇일까?
2-1. 객체 지향 프로그래밍
위키백과에 따르면 객체 지향 프로그래밍이란 프로그래밍 패러다임의 하나로,
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
라고 정의한다.
사실 객체 지향 프로그램은 C언어 등으로 작성된 절차 지향 프로그램에 비해 속도가 느리다.
모든 연산을 객체 간의 상호작용, 즉 메시지 교환으로 처리하기 때문이다.
간단한 사칙연산조차 객체를 생성하고 메서드를 호출해야하는 식이다.
그럼에도 객체 지향 프로그래밍을 채택하는 이유는, 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들어 프로그램 개발의 생산성을 증가시키기 때문이다.
생산성이 높다는 것은 사람이 이해하기 쉽고 만들기 편하단 얘기다.
객체 지향 프로그래밍을 적용하면 프로그램의 각 컴포넌트를 쉽고 유연하게 변경하면서 개발이 가능하다.
강의 저자(김영한 선생님)의 표현을 빌리자면 마치 블럭을 갈아끼우듯, 키보드, 마우스를 교체하듯이 말이다.
그래서 객체 지향 프로그래밍은 대규모 소프트웨어 개발 프로젝트 등에 많이 쓰인다.
2-2. 객체 지향의 가장 큰 특징 - 다형성
이렇게 개발 생산성을 증가시키는 객체 지향의 가장 큰 특징은 다형성(Polymorphism)이다.
흔히들 객체 지향 프로그래밍을 이야기할 때, 실세계의 존재 혹은 상호작용에 비유해 설명한다.
실세계의 존재와 객체를 1대1로 완벽히 매칭시킬 순 없지만,
실세계를 역할과 구현으로 분리하여 표현하면 객체 지향의 다형성에 대해 이해하기 쉽다.
실세계의 자동차를 예로 들어보자.
자동차를 역할과 구현으로 분리하면 다음과 같다.
여기서 자동차가 실제로 K3인지, 테슬라인지가 중요한가?
운전자는 자동차의 조작법만 알면 실제 자동차 모델이 무엇인지는 알 필요가 없다.
어떤 방식으로든 자동차의 기본적인 조작법은 통일되어 있기 때문이다.
운전자는?
따라서 운전자는 자동차의 운전 방법만 알면, 즉 제공된 인터페이스의 사용법만 숙지하면 자동차 모델에 상관없이 자동차를 운전할 수 있다.
자동차는?
또한 자동차는 자동차라는 역할 내에서 여러가지 모델을 원하는 만큼 출시할 수 있다. 자동차 구현의 확장이 이론상 무한대로 가능한 것이다.
여기서 운전자를 클라이언트로, 자동차를 서버로 확장해서 보면 다음과 같은 다형성의 특징에 대해 이해할 수 있다.
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
- 클라이언트는 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향받지 않는다.
즉, 다형성의 본질은 클라이언트를 변경하지 않고, 서버의 기능을 유연하게 변경할 수 있다는 점이다.
이를 자바 언어에서 어떻게 구현하는가?
다형성을 자바언어에서 구현하기 위해서는 오버라이딩을 활용한다.
역할을 인터페이스로 작성하고, 구현 클래스를 통해 구현하면 역할과 구현을 분리한 객체 설계가 가능하다.
한계점
물론 역할(인터페이스) 자체가 변하면 클라이언트,서버 모두에게 큰 변경이 발생하기 때문에, 인터페이스를 안정적으로 잘 설계하는 것이 무척이나 중요하다.
좋은 객체 지향 프로그래밍
즉, 좋은 객체 지향 프로그래밍은 다형성을 활용하여 프로그램 개발의 생산성을 높일 수 있어야 한다.
그리고 스프링은 이러한 객체 지향의 다형성을 극대화할 수 있도록 함으로써 좋은 객체 지향 프로그램을 만들 수 있도록 돕는다.
또한 객체 지향의 5가지 원칙(SOLID)를 따를수록 좋은 객체 지향 프로그래밍인데, SOLID에 대해서는 다음 포스트에서 정리한다.
'[inflearn] 스프링 핵심 원리 - 기본편 > 섹션 1 - 객체지향 설계와 스프링' 카테고리의 다른 글
4. 객체 지향 설계와 스프링 (0) | 2023.06.29 |
---|---|
3. 좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2023.06.29 |
1. 스프링이란 (0) | 2023.06.21 |