객체 지향 특징
- 추상화 : 공통의 속성이나 기능을 묶어 이름을 붙이는 것으로, 객체 지향 관점에서 클래스를 정의하는 것을 말한다.
- 캡슐화 : 객체가 맡은 역할을 수행하기 위한 하나의 목적을 묶는 것으로, 특정 기능을 위한 함수를 작성하는 것을 말한다.
- 상속성 : 상위 개념의 특징을 하위 개념이 물려받는 것이다.
- 다형성 : 객체 지향에서 가장 핵심적인 부분으로, 오버라이딩을 예시로 들 수 있다.
객체 지향 프로그래밍이란
- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위인 "객체"들의 모임 으로 파악하려 하는 것 이다.
- 각각의 객체는 메시지를 주고받고 데이터를 처리할 수 있다.
- 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. (= 다형성)
다형성
다형성을 이해하기 쉽게 역할(= 인터페이스)과 구현(= 인터페이스를 구현한 객체)으로 나누어보자.
위 이미지를 보면, 운전자 역할과 자동차 역할이 있다. 이는 각각 운전자와 자동차 인터페이스를 의미한다.
자동차 구현이란, 자동차 인터페이스를 가지고 구현한 여러 자동차들을 말한다.
더 알기 쉽게 말해보자면 다음과 같이 존재한다는 의미이다.
- 운전자 역할을 하는 운전자 인터페이스
- 자동차 역할을 하는 자동차 인터페이스
- 자동차 인터페이스를 가지고 여러 종류의 자동차를 구현하는 자동차 구현
이 상황에서 운전자는 자동차가 변경되는 것과 상관없이 "운전을 한다." 라는 자신의 역할을 수행한다.
즉, 운전자 역할은 자동차 역할이 변경되어도 상관이 없다는 것이다.
운전자는 자동차가 어떤 방식으로 구현되었고 어떠한 기능들을 가지고 있는지 몰라도 "자동차"가 있으면 "운전을 한다." 라는 행위를 할 수 있는 것이다.
이것이 의미하는 것은 다음과 같다.
- 인터페이스를 구현하는 것과 같이 다형성을 사용하면 클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수 있다. (= 확장 가능한 설계)
- 자동차 종류가 바뀌어도 "자동차"가 사라지는게 아니기 때문에 대체가 가능하여 유연하고 변경이 용이하다.
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야 한다.
- 클라이언트의 변경 없이 서버의 구현 기능을 유연하게 변경할 수 있다.
- 인터페이스를 안정적으로 설계하는 것이 매우 중요하다.
- 단, 역할(인터페이스) 자체가 변하면 클라이언트, 서버 모두에 큰 변경이 발생한다는 한계점이 있다.
객체
- 객체는 혼자 존재할 수 없다.
- 클라이언트가 요청을 하면 서버는 응답을 한다.
- 이 때 응답이란 요청에 의해 어떠한 행위를 하는 것을 말한다. (리턴 값이 없어도 응답이라고 한다.)
- 객체 클라이언트와 객체 서버는 협력 관계이다.
자바 언어
- 자바 언어의 관점에서 역할은 인터페이스를 의미하고, 구현은 인터페이스를 구현한 클래스 즉 구현 객체를 의미한다.
- 객체 설계 시에 역할과 구현을 명확히 분리해야 한다.
- 객체 설계 시에 역할(인터페이스)을 먼저 부여하고 그 역할을 수행하는 구현 객체를 만들어야 한다.
자바 언어의 다형성
- 오버라이딩을 예시로 들 수 있다.
- 다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.
- 클래스와 상속 관계에도 적용이 가능하다.
스프링과 객체 지향
- 다형성이 가장 중요하다.
- 스프링은 다형성을 극대화해서 이용할 수 있도록 도와준다.
- 스프링에서 말하는 제어의 역전(IoC), 의존관계 주입(DI) 은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
- 제어의 역전(IoC) : 하나의 설계 원칙으로 프로그래머가 직접 객체를 제어하지 않고 프레임워크, 컨테이너에서 제어를 수행하는 것을 말한다.
- 의존관계 주입(DI) : 의존 관계를 외부에서 결정해주는 것으로, 스프링에서는 DI 컨테이너가 객체들 간의 의존관계를 주입한다.
- 스프링을 사용하면 구현을 편리하게 변경할 수 있다.
해당 글은 인프런 > 스프링 핵심원리 기본편(김영한) 강의를 참고하여 작성하였습니다.
'기초이론 > Spring' 카테고리의 다른 글
[인프런]스프링 핵심원리 기본편_스프링 컨테이너와 스프링 빈(스프링 컨테이너 생성) (0) | 2022.11.02 |
---|---|
[인프런]스프링 핵심원리 기본편_스프링으로 전환하기 (0) | 2022.10.30 |
[인프런]스프링 핵심원리 기본편_IoC, DI, 그리고 컨테이너 (2) | 2022.10.29 |
[인프런]스프링 핵심원리 기본편_좋은 객체 지향 설계의 5가지 원칙(SOLID) (0) | 2022.09.28 |
[인프런]스프링 핵심원리 기본편_스프링이란? (0) | 2022.09.19 |