본문 바로가기
Back-end/java spring

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

by kkkdh 2022. 12. 24.
728x90

객체 지향 프로그래밍의 정의?

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

유연하고 변경에 용이하다는 것의 의미란?

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

그것이 바로 다형성을 의미한다!!


다형성의 실세계 비유

  • 실세계와 객체 지향을 1:1로 정확하게 매칭하기에는 무리가 있음
  • 그래도 비유를 하는 것이 이해에 도움이 된다.
  • 역할과 구현으로 세상을 구분!

두 가지 강의에서의 실세계에서의 다형성 예시들!

운전자는 자동차 역할(인터페이스)에만 의존하고 있기 때문에, 자동차 구현체가 어떤 것으로 바뀌어도 영향을 받지 않는 구조이다.

 

자동차의 역할(인터페이스)에 따라 자동차를 설계했기 때문에, 이러한 구조가 가능한 것이며, 이러한 구조는 자동차를 만드는 입장에서도 장점일 수 있지만, 가장 중요한 것은 사용자에게 좋다.

 

어떠한 자동차 구현체가 있다고 하더라도 자동차 역할에 대한 이해만 있다면, 자동차의 종류에 따라 설령 내부의 구조와 구현 방식이 달라진다고 하더라도 이에 상관없이 운전이 가능하다. 다른 대상으로 변환해도 상관없고, 새로운 것이 나와도 기존의 것을 대체할 수 있다면, 이러한 개념을 자동차 세상을 무한히 확장 가능한 구조라고 부른다.

 

이를 조금 더 디테일하게 살펴보면, 클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수 있음을 의미하게 된다. 이는 역할과 구현으로 세상을 구현했기 때문이다!!

 

요약하자면, 가장 중요한 것은 새로운 자동차의 구현이 아니라, 새로운 것이 나와도 운전자 역할을 새로운 것을 배울 필요가 없다는 점이다. (client를 바꿀 필요가 없는 것이다.)

 

공연 무대 예시 또한 마찬가지이다. 로미오, 줄리엣 역할만 정해놓는다면, 이를 다른 배우(구현체)로 대체한다 하더라도 공연 자체에는 문제가 없는 구조이다. (배우는 대체가 되더라도 공연에는 문제가 발생하지 않는다.)

 

이것이 바로 유연하고 대체가 가능한 구조라는 것을 의미한다.

 

다형성의 실세계 비유 예시들 정리!!

  • 운전자 - 자동차
  • 공연무대
  • 키보드, 마우스, 세상의 표준 인터페이스들
  • 정렬 알고리즘
  • 할인 정책 로직 등

역할과 구현을 분리한다는 것의 의미!

  • 역할과 구현으로 구분하면, 세상이 단순해지고, 유연해지며 변경도 편리해진다.
  • 장점
    • 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
    • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다. (로미오 배우는 줄리엣 대사를 몰라도 된다.)
    • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다. (운전자는 자동차가 어떻게 만들어졌던 상관이 없다. 그냥 엑셀 밟으면 가고 브레이크 밟으면 멈추기만 하면 된다.)
    • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다. (K3에서 테슬라로 바꿔도 세상을 바꿀 필요는 없는 것처럼)

자바 언어에서의 역할과 구현을 분리

  • 자바 언어의 다형성 활용
    • 역할 = 인터페이스
    • 구현 = 인터페이스를 구현한 클래스, 구현 객체
  • 객체를 설계할 때, 역할과 구현을 명확히 분리한다. (핵심은 구현보다 인터페이스(역할)이 먼저라는 점.. 물론 일반 상속으로도 객체 지향의 다형성 구현이 가능하다고..)
  • 객체 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기

객체의 협력이라는 관계부터 생각하자

  • 혼자있는 객체는 없다.
  • 클라이언트: 요청, 서버: 응답
  • 수많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 갖는다.

클라이언트가 서버 자체가 될수도. 클라이언트는 그저 요청을 보내는 대상을 지칭하는 개념이다.

자바 언어의 다형성

  • 오버라이딩은 자바 기본 문법 (부모 클래스에서 상속받은 method를 자식 클래스에 맞게 재정의하는 것을 의미)
  • 상황에 맞게 오버라이딩된 메서드가 실행
  • 다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다는 것이 자바에서의 다형성의 장점
  • 물론 클래스 상속 관계도 다형성, 오버라이딩 적용이 가능하다.

클라이언트는 MemberRepository에 의존(알고있다.)
MemberRepository에 다양한 구현체를 할당할 수 있다.

부모에 자식을 대입할 수 있으나, 자식에 부모를 대입할수는 없다. MemberRepository interface와 관련 없는 구현체는 할당이 당연히 불가능하다.

interface에 담기는 구현체에 따라서 왼쪽 하단과 같이 다른 방식으로 호출되게 된다.

다형성의 본질

  • 인터페이스를 구현한 객체 인스턴스를 실행 시점에서 유연하게 변경할 수 있다.
  • 다형성의 본질을 이해하려면, 협력이라는 객체 사이의 관계에서 시작해야 한다.
  • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다!

역할과 구현을 분리한다는 것은

  • 실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 지향의 세상으로 가져올 수 있게 된다.
  • 유연하고, 변경이 용이해짐
  • 확장 가능한 설계
  • 클라이언트에 영향을 주지 않는 변경이 가능하다.
  • 인터페이스를 안정적으로 설계하는 것이 가장 중요한 포인트이다.

한계점 또한 존재

  • 역할(인터페이스) 자체가 변하면, 클라이언트와 서버 모두가 큰 변경이 필요해진다.
  • 자동차를 비행기로 대체한다면??
  • 연극의 대본 자체가 변경된다면??
  • USB의 인터페이스가 변경된다면??
  • 인터페이스를 안정적으로 잘 설계하는 것이 매우 매우 중요하다!

다시 스프링과 객체 지향에 대해서

  • 어찌보면, 객체 지향에서 가장 중요한 개념은 다형성이다!
  • 스프링은 이러한 다형성을 극대화해서 이용할 수 있도록 돕는 프레임워크
  • 스프링에서 이야기하는 제어의 역전(IoC), 의존 관계 주입(DI)는 다형성을 활용해 역할과 구현을 편리하게 다룰 수 있도록 지원하는 개념이다. (차후에 코드와 함께 정리)
  • 스프링을 사용하면, 마치 레고 블럭을 조립하듯! 공연 무대의 배우를 선택하듯! 구현을 편리하게 변경할 수 있게 된다.

 

728x90

댓글