Kim-Baek 개발자 이야기

[스프링 핵심원리] 3. 좋은 객체 지향 프로그래밍이란? 본문

개발/Spring

[스프링 핵심원리] 3. 좋은 객체 지향 프로그래밍이란?

김백개발자 2021. 9. 23. 14:54
김영한님의 [스프링 핵심 원리] 강의를 정리하고, 내가 생각한 내용까지 정리하는 포스팅

지난번 강의에서 스프링은 결국 객체지향을 잘 할 수 있게 만들어주는 프레임워크라는 것까지 내용이 나왔다. 그렇다면 이것을 알기 전에 객체 지향이란 것이 뭔지 잘 알아야지 스프링을 더 잘 이해할 수 있을 것이다.

객체 지향의 특징에는 추상화, 캡슐화, 상속, 다형성이 있다. 이 중에서 다형성을 가장 중요한 핵심개념이라고 설명한다. 그렇다면 우선 객체 지향의 정의는 무엇일까?

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지 를 주고받고, 데이터를 처리할 수 있다. (협력)
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프 트웨어 개발에 많이 사용된다.

여기서 중요한 것은 바로 유연과 변경이다. 이 유연하고 변경이 용이한 프로그래밍을 도와주는 객체지향의 특징이 다형성인 것이다. 이것을 실세계에 비유해서 설명을 해볼 수 있다. 실세계에서 역할과 구현으로 세상을 구분한다고 해보자.

일반적로 다형성을 설명할 때 나오는 이미지라고 할 수 있다. 운전자의 역할을 지니는 사람은 자동차의 역할만 알면된다. 엑셀을 밟으면 앞으로 나가고, 핸들을 움직이면 방향을 전환하는 것이 자동차의 역할일 것이다. 실제로 타는 차가 K3에서 아반떼로 변경이 되었다고 해서 이런 기능은 전혀 변할 게 없는 것이다.

아예 자동차가 내연기관이 아닌 전기차로 변경이 되었다고 해보자. 테슬라 모델3를 탄다고 해서, 달라지는 게 있을까? 아니다. 자율주행과 같은 새로운 기능이 추가되거나 엔진은 변경이 되었을 지 몰라도, 기본적인 자동차의 역할은 그대로 갖고 있기 때문에 운전자는 자동차가 변경되더라도 그대로 사용하면 된다.

공연 무대로 변경해서 생각해봐도 동일하다. 로미오의 역할이나 줄리엣의 역할은 고정이 되어있고, 이미 대사나 행동은 정해져 있는 것이다. 이것을 실제로 연기하는 사람은 변경이 될 수 있다. 하지만 이것을 연기하는 사람이 변경되었다고 해서, 실제 공연에서 대사나 행동이 변경되지는 않는 것 이다.

이렇게 역할과 구현을 분리하면, 단순해지고 변경에 유연해지는 것을 느낄 수 있을 것이다. 역할과 구현의 장점을 보도록 하자.

  • 클라이언트(운전자)는 대상의 역할(인터페이스)만 알고 있으면 된다.
  • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다. ( K3가 엑셀을 밟으면 앞으로 어떻게 나가는지 관심 없다.)
  • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다. (내연기관에서 전기차 엔진으로 변경되어도 사용하는데 문제가 없다)
  • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다. (K3가 아반떼로 바껴도 상관없다)

이러한 역할과 구현은 자바에서는 인터페이스(역할), 인터페이스를 구현한 클래스(구현)인 것이다. 그렇기 때문에 객체를 설계 할 때, 역할을 먼저 부여하고 이를 수행하는 객체를 구현하는 것이다.

객체는 혼자서는 절대 사용이 될 수 없다. 항상 협력을 하면서 사용이 되는데, 수 많은 클라이언트 객체 (사용자)가 요청을 하면 객체 서버가 응답을 하는 협력을 하는 것이다.

자바에는 오버라이딩이라는 기능이 있다. 상위 메소드를 오버라이딩해서 재구현을 할 수 있는데, 클라이언트가 서버의 기능을 사용하면, 구현된 객체에서 오버라이딩 된 메소드가 실행되는 형식이다. 

위와 같은 구조에서 MemberService 는 MemberRepository 인터페이스에 의존하고, save 메소드를 사용할 것이다. 

public class MemberService {
	//아래의 두 개중 필요한 것을 선택해서 사용할 수 있게 된다.
	MemberRepository memberRepository = new MemoryMemberRepository();
    
    MemberRepository memberRepository = new JdbcMemberRepository();
}

의존하는 것은 역할인 인터페이스이기 때문에, 어떤 구현을 원하느냐에 따라 위와같이 구현 클래스를 변경하면서 사용할 수 있게 되는 것이다.

결국 다형성이란 것은 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있는 것이다. 클라이언트의 변경이 없이 서버의 구현 기능을 유현하게 변경할 수 있는 것이다.

하지만 한계도 존재하는데, 역할 자체가 변경이 되어버린다면, 클라이언트와 서버 모두 큰 변화가 필요하다는 것이다. 그렇기 때문에 인터페이스에 대한 안정적인 설계가 중요하다.

반응형
Comments