프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 수많은 '객체' 단위로 나누고 이들의 상호작용으로 서술하는 방식, '객체'란 하나의 역할을 수행하는 메소드와 변수들의 묶음으로 봐야 한다.
'객체'는 틀로 생각한다.
흔히 드는 예시로 자동차가 있다. 시중의 자동차 종류는 여러가지가 있다. 그리고 이 모든 종류를 하나로 묶는 객체는 자동차이다.
객체는 실제로 존재하거나 추상적으로 생각하는 것 중 자신만의 속성을 가지며 다른 객체와 구분이 될 수 있는 것이라 정의할 수 있다.
위 객체라는 정의를 바탕으로 탄생한 객체 지향은 다음과 같은 몇가지 특징을 가진다.
⭐️ 다형성
⭐️ 추상화
⭐️ 캡슐화
⭐️ 상속
⭐️ 정보 은닉
다형성(polymorphism)이란 '하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것'을 말한다. 즉, 여러가지 형태를 가질 수 있는 능력이다.
다형성은 다른 객체 지향의 특징들보다 더 스프링과 깊은 연관이 있어 깊게 다루려 한다.
다형성을 실세계에 대입하여 설명해보자. 실제 세계는 역할과 구현으로 추상화될 수 있다.
운전자 역할은 자동차 역할을 운전할 수만 있다면 자동차의 종류(구현)가 무엇인지는 상관하지 않을 것이다.
운전자를 클라이언트, 자동차를 서버라 가정해보자.
클라이언트는 자기가 사용하고자 하는 대상의 역할 즉, 인터페이스만 알면 된다. 클라이언트는 구현 대상의 내부 구조를 몰라도, 구현의 내부 구조가 변경되도, 구현 대상 자체가 바뀌어도 전혀 상관하지 않아도 된다.
이것이 가능한 이유는 세상을 역할과 구현으로 구분했기 때문이다. 새로운 자동차가 나와도 클라이언트는 아무런 변경을 거치지 않아도 된다.
역할 = 인터페이스
구현 = 인터페이스를 구현한 클래스, 구현 객체
객체 설계 시, 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
이제 다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.
지난번 포스팅에서 들었던 예시를 다시 들겠다. 파란색으로 표시한 MemberService가 클라이언트로써 호출한 save() 메서드는 interface인 MemberRepository로 가서 해당 인터페이스가 연결 되어있는 구현 부분의 메서드를 가져온다. 즉, 클라이언트가 사용할 수 있는 구현은 두가지가 될 수 있다.
이로써 우리는 확장에 열려있는 설계가 가능하다. 자동차에서 전기차라는 혁신이 등장해도 자동차의 역할만 할 수 있다면 운전자는 아무런 영향을 받지 않는 것처럼 말이다.
Spring은 다형성을 극대화할 수 있다.
저번 포스팅에서 Spring의 핵심 기능으로 설명한 DI/IoC는 이 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
스프링을 공부하기 위해서 쌓아야 할 기본적인 지식이 더 필요하다. 다음은 [좋은 객체 지향 설계를 지키기 위한 5가지 원칙_ SOLID 원칙]에 대해서 알아보겠다.
객체 지향 프로그래밍
Spring 개요
[Spring 핵심 원리 - 기본편] 2) 객체 지향
스프링 핵심 원리 - 기본편