1.3.1 다형성의 실세계 예시
좋은 객체 지향의 핵심은 다형성에 있다.
먼저, 다형성을 실세계에 비유하여 이해하기 위해,
세상을 역할 과 구현으로 구분해보자.
운전자를 클라이언트라고 하고, 자동차라는 역할이 있다고 가정하자.
자동차 역할은 K3, 아반떼, 테슬라 모델3 각각의 자동차 구현을 통해 수행될 수 있다.
이때, 운전자는 자동차 모델이 바뀌더라도, 운전자의 역할은 동일하게 수행가능하다.
즉, 운전자는 자동차 역할(인터페이스) 에 대해서만 의존하게 된다.
여기서 중요한 핵심은,
자동차 역할이라는 인터페이스를 만드는 이유는, 운전자라는 클라이언트의 편의성을 높이기 위함이다.
즉, 클라이언트에 영향을 주지 않고, 구현의 변경이 유연하고 용이하도록 하는 것을 다형성 이라고 한다.
1.3.2 Java 에서의 다형성 구현
앞선 실세계 예시를 Java 언어에 적용하면 다음과 같다.
역할 = 인터페이스
구현 = 인터페이스를 구현한 클래스, 구현 객체
따라서, Java 코드를 작성할 때는, 인터페이스와 구현 객체를 명확히 분리하여야 한다.
먼저, 객체를 설계할 때 어떤 역할을 부여할지를 인터페이스에서 작성한 후,
그 역할을 수행하는 구현 객체를 만든다.
다시말해, 객체를 구현하기에 앞서, 인터페이스(역할)가 선행되어야 한다.
이때, 인터페이스가 변화하면, 모든 객체에게 영향이 가기 때문에,
인터페이스를 안정적으로 설계하는 것이 매우 중요하다.
1.3.3 객체의 협력 관계
객체는 다음과 같이 나뉘며, 이 두 객체는 협력 관계에 있다.
클라이언트
: 요청하는 객체
서버
: 응답하는 객체
(단, 클라이언트가 동시에 서버가 될 수도 있다.)
이때, 수많은 클라이언트 객체와 서버 객체는 서로 협력 관계를 가진다.
1.3.4 다형성의 본질
앞선 3개의 개념으로 다음과 같이 다형성의 본질을 정의할 수 있다.
1) 인터페이스를 구현한 객체는 실행시점에 유연하게 변경 가능하다. (확장 가능한 설계)
2) 다형성의 본질을 이해하기 위해서는, 객체간의 협력 관계를 이해해야 한다.
3) 클라이언트를 변경하지 않고도, 서버의 구현기능을 변경할 수 있다.
+ 한계점 )
역할(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경이 발생한다.
따라서, 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
1.3.5 스프링과 객체지향 (다형성)
앞서, 다형성의 본질에 대해 살펴봤으니,
스프링에서 다형성이 어떻게 구현되는지 살펴보자.
스프링은 다형성을 극대화하여 이용할 수 있도록 돕는 기술이다.
즉, 스프링에서의 IoC(제어의 역전), DI(의존관계 주입) 는 모두 다형성을 활용하며,
역할과 구현을 편리하게 다룰 수 있도록 지원한다.
김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.
'SPRING 핵심 원리 [ 기본편 ]' 카테고리의 다른 글
[스프링 핵심 원리] 섹션 2.1 예제만들기 (프로젝트 생성) (0) | 2023.01.24 |
---|---|
[스프링 핵심 원리] 섹션 1.5 객체 지향 설계와 스프링 (0) | 2023.01.18 |
[스프링 핵심 원리] 섹션 1.4 객체 지향 설계와 스프링 (SOLID) (0) | 2023.01.18 |
[스프링 핵심 원리] 섹션 1.2 객체 지향 설계와 스프링 (스프링이란?) (0) | 2023.01.18 |
[스프링 핵심 원리] 섹션 1.1 객체 지향 설계와 스프링 (스프링의 탄생) (0) | 2023.01.18 |