Home 좋은 객체 지향 프로그래밍이란?
Post
Cancel

좋은 객체 지향 프로그래밍이란?

좋은 객체 지향 프로그래밍 이란?

이전 포스팅에서 스프링의 탄생과 배경을 알아보았다. 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있도록 도와주는 프레임워크라 하였는데 좋은 객체 지향 프로그래밍이란 무엇일까? 객체지향 프로그래밍의 사전적 의미부터 알아보자.

객체지향 프로그래밍

  • 객체지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 “객체“들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

  • 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.

    객체 지향 프로그래밍의 핵심 키워드

    • 추상화: 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것
    • 캡슐화: 실제 구현 내용 일부를 외부에 감추어 은닉 하는 것
    • 상속: 객체들 간의 관계를 구축하는 방법
    • 다형성: 하나의 객체가 여러 가지 타입을 가질 수 있는 것
  • 소프트웨어 아키텍트 관점에서의 객체지향

    객체지향이란 다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 획득할 수 있는 능력이다.


위의 내용을 해석해보면 좋은 객체 지향 프로그래밍이란 한마디로 유연하고 변경이 용이 하도록 프로그래밍 하는 것을 말한다.

  • 레고 블럭 조립하듯이
  • 키보드, 마우스를 갈아 끼우듯이
  • 컴퓨터 부품을 갈아 끼우듯이
  • 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법

다형성

레고 블록을 조립하듯 프로그래밍 한다는 것은 무슨말일까? 그리고 이것은 어떻게 가능한 것일까? 우선 다형성에 대해 알아보자.

역할과 구현을 분리

지금부터 예시를 들어보려 한다. 우선 우리의 실세계를 역할구현으로 구분하여 생각해 보려한다.

그림을 보면 운전자와 자동차가 있다. 먼저 운전자와 자동차 둘을 분리하여 표현해보자.

  • 운전자
    • 운전자는 자동차를 운전하는 사람이다.
    • 운전자는 자동차를 사용하는 주체이고 운전을 하는 역할을 가지고 있다.
  • 자동차
    • 자동차는 운전자가 있어야만 움직인다.
    • 자동차는 운전자에 의해 사용되어 진다.
    • 자동차의 역할은 운전자의 조작에 맞게 주행하는 것이다.
    • 자동차는 생산하는 회사와 차종이 다양하다.

세상에는 수 많은 종류의 자동차가 존재한다. 그 자동차들은 제조 회사도 다르고 크기나 종류등 많은 부분이 다르다. 하지만 우리는 그것들을 모두 자동차라고 부른다. 그리고 그 수 많은 자동차들을 운전면허만 있다면 운전이 가능하다.

생김새도 다르고 크기도 다르고 그 외 수많은 것들이 다른데 왜 우리는 그 다른 것들의 운전법을 새로 배우지 않고도 운전이 가능한 것일까? 왜 새로운 차종이 출시 되었을 때 우리는 새로운 면허를 취득하지 않아도 되는 것일까?

자동차의 역할

결론부터 말하면 우리는 자동차의 역할을 알고 있기 때문이다.

자동차는 차종과 상관없이 조향장치를 통해 방향을 전환하고 브레이크를 밟으면 정지하고 엑셀레이터를 밟으면 속도가 높아지는 것을 알고 있다. 다시 말해서 새로운 차종이 출시된다 할지라도 그것이 자동차의 역할만 수행한다면 운전자는 아무런 영향을 받지 않는다.

다형성이란 이렇게 역할구현으로 구분함으로써 그 역할을 수행하는 다양한 형태의 구현으로 대체할 수 있는 것이다. 이렇게 역할구현으로 구분하면 세상이 단순해지고, 유연해지며 변경도 편리해진다.

자바의 다형성

자바에서는 다형성을 어떻게 표현할 수 있을까? 자바는 오버라이딩을 통해 다형성을 표현한다.

  • 역할 = 인터페이스
  • 구현 = 인터페이스를 구현한 클래스, 구현 객체
  • 객체 설계 시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만든다.

다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.

1
2
3
4
public class MemberService {
	// private MemberRepository memberRepository = new MemoryMemberRepository();
	private MemberRepository memberRepository = new JdbcMemberReposititory();
}

다형성의 본질

프로그래밍 관점에서 이야기 한다면 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있고 이는 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다는 말이다.

참고

This post is licensed under CC BY 4.0 by the author.

스프링 이란? (스프링의 탄생과 역사)

좋은 객체 지향 설계의 5가지 원칙(SOLID)

Comments powered by Disqus.