해당 글은 Inflearn(https://www.inflearn.com/)에서 제공하는 김영한 개발자 님의 스프링 핵심 원리 - 기본편(https://www.inflearn.com/course/스프링-핵심-원리-기본편/dashboard)를 듣고 제가 학습한 내용을 정리한 내용입니다. 학습 내용의 모든 출처는 해당 강의에 있습니다.
객체란 틀이라 생각하면 된다. 자동차를 예로 들어보자.
자동차의 종류는 여러가지가 있다. 포르쉐, 람보르기니, 투싼 등. 하지만 이 모든 종류를 하나로 묶는 객체는 자동차이다.
즉, 객체는 실제로 존재하거나 추상적으로 생각하는 것 중 자신만의 속성을 가지며 다른 객체와 구분이 될 수 있는 것이라 정의할 수 있다.
추상화, 캡슐화, 상속, 다형성, 정보 은닉은 객체 지향의 대표적인 특징이다.
객체 지향 프로그래밍이란 컴퓨터 프로그램을 여러 객체들의 모임으로 파악하는 것이다. 각각의 객체는 메세지라는 소통 수단을 주고 받고 협력하여 데이터를 처리한다.
객체 지향 프로그래밍은 객체 지향 특징인 다형성을 이용해 프로그램을 유연하고 변경 용이 하기 만들기 때문에 대규모 소프트웨어 개발에 사용된다.
여기서, 프로그램을 유연하고 변경 용이하게 만든다는 것은 프로그램에서 컴포넌트를 필요할 때 마다 쉽게 갈아끼울 수 있는 것을 말한다.
다형성이란 "여러 가지 형태를 가질 수 있는 능력"을 의미한다. 간단히 역할과 구현으로 구분해보자.
운전자 역할과 자동차 역할이 있고, 자동차 하위에 K3, 아반떼, 테슬라 모델이 있다.
운전자는 자동차를 운전만 할 수 있으면 된다. 따라서, 자동차의 종류가 K3에서 아반떼로 바뀌던 테슬라로 바뀌던 자동차의 역할만 제대로 한다면 운전자에겐 문제가 없다.
운전자를 클라이언트라 생각하고, 자동차를 서버라고 생각해보자.
클라이언트는 대상 역할(인터페이스)만 알면된다.
클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
클라이언트는 구현 대상 내부 구조가 변동되어도 영향이 없다.
클라이언트는 구현 대상 자체를 변경해도 영향이 없다.
자바에서 다형성은 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것이다. 간단히 역할을 인터페이스로 구현을 인터페이스를 구현할 구현 객체, 클래스라고 생각하면 된다.
public interface Car {
public boolean isHybrid();
}
public class Tucson implements Car{
@Override
public boolean isHybrid() {
return true;
}
}
public class Tico implements Car{
@Override
public boolean isHybrid() {
return false;
}
}
자바에서는 오버라이딩 문법을 통해 다형성을 구현할 수 있다. 다형성을 통해 Car인터페이스를 구현한 Tucson 객체 혹은 Tico 객체를 실행 시점에 유연하게 변경할 수 있다.
public class UserCar {
Car car = new Tucson();
Car car2 = new Tico();
}
UserCar(클라이언트)가 Tucson객체를 구현하면 car.isHybrid()를 출력하면 true를 리턴할 것이고, Tico 객체를 구현하면 car2.isHybrid()를 출력하면 false를 리턴할 것이다.
즉, 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경가능하게 함으로써 여러가지 기능을 클라이언에게 영향을 주지 않고 확장이 가능하다.
반면에, 인터페이스 자체가 변한다면 클라이언트, 서버 모두에게 큰 변경이 발생하기 때문에 인터페이스를 안정적으로 잘 설계하는 일이 중요함을 알 수 있다.
스프링 프레임워크는 자바의 다형성 특징을 극대화 하여 이용할 수 있게 해준다.
제어의 역전(IoC), 의존성 주입(DI)은 모두 다형성을 활용해 역할과 구현을 편리하게 다룰 수 있도록 지원하는 것이다.
Inflearn 김영한 님의 스프링 핵심 원리 - 기본편 : https://www.inflearn.com/course/스프링-핵심-원리-기본편/dashboard