Programming/OOP

OOP - 객체지향이란 무엇인가?

JaeHoney 2022. 5. 16. 22:05

객체지향

많은 분들이 객체지향 프로그래밍은 현실 세계의 모방, 추상화를 통해 프로그래밍에 반영하는 것이라고 말한다. 이러한 설명은 실용적인 관점에서 객체지향을 설명하기에 적합하지 않다.

 

가령 우리는 상속의 예시를 들 때 인간, 도형 등의 예시를 들고 추상화를 배울 때 동물, 타이어, 자동차 등의 예시를 들곤 한다. 이를 실제 소프트웨어에 접목할 수 있는가?

 

객체지향의 목표는 실세계를 모방하는 것이 아니다. 새로운 세계를 창조하는 것이다.

 

객체지향에서 가장 널리 퍼져있는 오해는 클래스가 객체지향 프로그래밍의 중심이라는 것이다. 객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.

역할, 책임, 협력

객체지향이라는 말에서 어떤 단어가 먼저 떠오르는가? 많은 사람들은 클래스와 상속을 떠올린다. 하지만 객체지향의 핵심은 역할, 책임, 협력이다.

 

객체들은 협력에 참여하기 위해 특정한 역할을 맡고, 역할에 적합한 책임을 수행하게 된다. 즉, 객체는 독립적인 존재가 아니라 어떠한 기능을 구현하기 위해 협력하는 공동체의 구성원인 것이다!

 

역할과 책임에는 특징이 몇가지 있다.

  • 여러 구성원이 동시에 역할을 수행할 수 있다.
    • 손님 입장에서 주문한 커피만 마실 수 있다면 누가 주문을 받는 지는 중요하지 않다.
  • 역할은 대체할 수 있다.
  • 책임을 수행할 수 있는 방법은 자율적으로 선택할 수 있다.
    • 요청을 받은 사람들은 자신만의 방법으로 다른 결과물을 만들 수 있다. (다형성)
  • 한 사람이 동시에 여러 역할을 수행할 수 있다.

 

객체지향 프로그래밍은 기능을 구현하는 데 협력하는 객체들에게 얼마나 적절한 역할과 책임을 부여할 수 있느냐에 달려 있다.

요청과 응답

일상에서 사람들은 자신이 잘 모르는 문제에 대해 부딪히면, 해당 분야의 담당자 또는 잘 아는 사람에게 도움을 요청(request)한다. 그리고 이러한 요청은 연쇄적으로 일어난다.

 

요청을 받은 사람은 주어진 책임을 다하면서 필요한 지식이나 서비스를 제공한다. 즉, 다른 사람의 요청에 응답(response)한다. 요청이 연이어 발생하기 때문에 응답 역시 연쇄적으로 전달된다.

 

이러한 요청과 응답을 통해 다른 사람과 협력(collaboration) 할 수 있는 능력으로 공동체는 거대하고 복잡한 문제를 어렵지 않게 해결한다.

 

협력의 성공 여부는 각 역할이 얼마나 체계적으로 잘 이루어져있는지, 특정한 역할을 맡은 각각의 구성원이 얼마나 성실히 요청을 행하는지에 달렸다.

 

객체

위에서 설명했던, 기능에 협력하는 구성원객체, 에이전트의 요청메시지, 에이전트가 요청을 처리하는 방법메서드라고 설명하면 마법같이 객체지향이 설명이 된다. 이러한 점이 많은 사람들이 객체지향을 설명하기 위해 실세계를 모방하는 이유이다.

 

추가적으로 흔히 객체를 상태(state)행동(behavior)을 함께 지닌 실체라고 정의한다. 가령, 바리스타가 커피를 제조하는 책임을 수행하기 위해서 제조법을 모른다는 것은 말이 안된다. 즉, 행동을 하기 위해서는 상태가 필요하다. 이때 상태에 해당하는 것이 속성이다.

 

요약

지금까지 객체지향에 대한 설명을 설명을 종합하면 아래와 같이 정리할 수 있다.

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
  • 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다. 행위는 상태의 영향을 받는다.
  • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.