객체가 역할에 따른 책임을 잘 수행하고 객체들간 메세지를 통한 협력이 잘 이루어질 때 좋은 객체 지향 프로그래밍이 이루어질 수 있다고 생각합니다.
이번 글에서는 스프링에 초점을 맞춰 객체지향 프로그래밍을 정리해보겠습니다.
객체 지향 프로그래밍 (Object-oriented programming)
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는것이다.
-wikipedia-
- 각각의 객체는 메세지를 주고받고, 데이터를 처리할 수 있습니다.

- 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트 웨어 개발에 많이 사용됩니다.
객체 지향 프로그래밍의 4가지 특징은 추상화, 상속, 캡슐화, 다형성입니다.
스프링에서 주목해봐야할 특징은 바로 다형성 입니다.
다형성과 역할과 구현
저는 다형성이란 한 가지 타입이 여러가지로 구현되어 구현체만의 특성을 가질 수 있는 성질이라고 생각합니다.
이 구현체는 해당 타입(역할) 에 속하지만 자신만의 특성(구현)을 가질 수 있습니다. 다형성으로 인해 해당 타입에 속하는 다양한 구현체를 만들 수 있습니다.
아래의 예시로 다형성을 사용해 역할에 의존할 때의 장점을 살펴 보겠습니다.
운전자 역할 → 자동차 역할(interface) → 아반떼, 소나타, 그랜져 (자동차 구현)
- 자동차 종류가 바뀐다고해서 운전자에게 영향을 미치지 않습니다.
- 클라이언트가 자동차의 내부 구조를 몰라도 됩니다.
- 자동차 구현체에 의존하지 않습니다.
- 자동차 역할에 의존합니다.
- 역할과 구현으로 세상을 구분
- 새 자동차가 나와도 클라이언트를 바꾸지 않아도 됩니다.
- 변경 가능, 대체 가능 (역할은 구현에 영향받지 않음)
- 역할과 구현으로 세상을 구분하면 세상이 단순해지고, 유연해지며 변경도 편리해집니다.
- 클라이언트는 역할(인터페이스)만 알면 됩니다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 됩니다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향받지 않습니다.
- 클라이언트는 구현 대상 자체를 변경해도 영향받지 았습니다.
역할과 구현을 분리
- 자바 언어의 다형성을 활용하여 역할과 구현을 분리할 수 있습니다.
- 역할 : 인터페이스
- 구현 : 인터페이스를 구현한 클래스, 구현 객체
- 객체를 설계할 때 역할과 구현을 명확히 분리
- 객체 설계시 역할(인터페이스)을 먼저 부여하고, 책임을 수행하는 구현 객체 만드는 것이 좋습니다.
객체의 협력이라는 관계부터 생각
- 혼자 있는 객체는 의미가 없습니다.
- 수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계 입니다.
- 클라이언트 : 요청하는 쪽을 가르키는 용어
- 서버 : 응답하는 쪽을 가르키는 용어
- 요청과 응답의 관계라면 모두 클라이언트와 서버의 관계가 성립합니다.
자바 언어의 다형성
- 오버라이딩
- 인터페이스를 구현했다면 오버라이딩 된 메서드가 실행됩니다.
- 다형성으로 인터페이스를 구현한 객체를 실행시점에 유연하게 변경이 가능합니다.
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있습니다.
Summary
객체지향 프로그래밍은 기본적으로 객체들간 협력을 통해 유기적으로 이루어지는 프로그래밍 컨셉입니다.
이렇기 때문에 잘못설계하면 예상치못한 결과를 만들 수 도 있고, 변경시 많은 부분에 이것이 파급을 줄 수 있습니다. 이것이 함수형 프로그래밍이랑 크게 비교되는 부분이라고 생각합니다.
스프링은 객체지향 프로그래밍 컨셉에 따라 정말 잘 설계된 프레임워크입니다. 그 중 다형성을 정말 극대화했기 때문에 이를 잘 이해한다면 스프링에 대한 접근이 쉬울 것이라고 생각합니다.
객체지향 프로그래밍
- 객체는 메세지를 통해 각자의 책임을 처리하고 이를 통해 역할을 수행합니다.
- 결국엔 최종적으로 제공되어야할 기능은 객체들간의 협력을 통해 이루어집니다.
- 최종 사용자 → 메세지(주문을 결제해주세요) → 서버 → 메세지 → 객체
- 최종 사용자 ← 메세지(결제완료) ← 서버 ← 객체 간의 협력
다형성
- 실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있습니다.
- 유연하고, 변경이 용이합니다.
- 확장 가능한 설계를 가능하게 합니다.
- 클라이언트에 영향을 주지 않는 변경 가능합니다.
- 인터페이스를 안정적으로 잘 설계하는 것이 매우 중요합니다.(추상화)
- 스프링은 다형성을 극대화하는 프레임워크 입니다.
- IoC, DI → 역할과 구현을 편리하게 다룰 수 있도록 지원
- 구현을 편리하게 변경할 수 있다!