객체 그리고 추상화


들어가기전

OOP 혹은 객체지향 프로그래밍이라는 단어는 개발자라면 수도 없이 들었던 단어이다. 특히 신입 개발자 대상으로 자주 나오는 질문 중 하나로써 개발자가 OOP라는 개념에 대해 얼마만큼 인지하고 있는지에 대해 중요시 여겨지고 있다.

이를 입증하듯 대부분의 대형 프로젝트에선 OOP를 사용하며 개발을 하고 있고 이는 OOP가 개발의 효과적인 프로그래밍이라는 것을 입증하는 동시에 하나의 대표적인 프로그래밍의 패러다임으로써 자리매김했다는 뜻이기도 한다. 이처럼 OOP의 개념을 인지하는 것은 매우 중요하다.

본 포스팅은 OOP에 대해 알아 보기 위한 포스팅들 중, 첫 번째의 주제이다. 객체지향, 객체, 추상화는 OOP를 알아보기전 짚고 넘어가야할 개념들이고, 본 포스팅을 통해 이 개념들을 다시 정리할 시간을 가지려 한다.

학습 목표

OOP는 Object-Oriented Programming의 약자로 “객체지향 프로그래밍”이라고 부른다. 이처럼 OOP에 대해 알기 위해선 OO의 개념은 매우 중요하다. OO의 개념정리를 통해 우리는 다음과 같은 학습 목표를 가질 수 있다.

  1. 객체 지향의 개념
  2. 객체 개념에 대한 이해
  3. 추상화에 대한 이해

객체지향(OO, Object-Oriented)

OO(Object-Oriented)는 “객체지향”이라 부른다.

  • 객체(客體) : 작용의 대상이 되는 쪽.
  • 지향(指向) : 정해지거나 작정한 방향으로 나가는 것. 또는, 그 방향.

다음 사전 정의에 빗대어 보면 “객체지향”의 용어는 “객체를 추구한다.”이라는 의미와 가깝다.

img

그렇다면 객체지향이란 객체의 방향성 혹은 객체를 추구한다라는 의미와 같다고 봐야할까?

일반적으로 영어로 된 IT 용어들을 직역하고 그대로 수용할 수 있다. 하지만 단순히 직역하며 해석하는 데 있어, 용어에 대해 잘못 해석하는 경우가 생기거나 직역된 의미가 기술 용어에 대해 정의하기엔 부족한 경우가 생긴다.

본론으로 돌아와서 우리는 -Oriented의 의미에 대해 다시 확인해 볼 필요가 있다.

영어 사전에 정의된 -Oriented는 “방향성”의 의미가 아닌, “위주” 혹은 “주된”이라는 의미에 가깝다.

  • 객체(客體) : 작용의 대상이 되는 쪽.
    → 객관적으로 존재하는 실체
  • 지향(指向) : 정해지거나 작정한 방향으로 나가는 것. 또는, 그 방향.
    → 위주, 주된

정리하자면 객체지향은 “객체 추구” 보다는 “객체 위주”가 더 적합하다. 따라서 OOP는 “객체 위주로 프로그램하다.”라는 의미이다. 이 의미는 우리에게 두 가지 학습해야 할 목표를 제시하고 있다. 첫 번째 객체의 개념과 프로그램에서 객체를 어떻게 정의하는지에 대해 알아볼 필요가 있다.

객체(Object) - 객관적으로 존재하는 실체

먼저 프로그래밍에서 객체(Object)의 의미는 프로그램을 구성하는 단위 중 하나로써 메모리에 할당된 공간을 의미한다. 이 객체의 논리적인 의미는 우리가 일상에서 접하는 객체와 유사하다.

일상에서 접하는 객체는 객관적으로 묘사할 수 있는 모든것들을 포함한다.

img

예를 들어 자판기를 사용하는 모습을 객체로 묘사해보자면 자판기를 사용하는 사용자부터 그 사용자를 서술할 수 있는 특징들과 판매되는 상품들 그 상품들을 묘사할 수 있는 특성, 색상, 가격 그리고 자판기의 아주 작은 요소인 버튼 같은 것들까지 모두 망라한다.

추상화 - 대상을 분리하다.

이러한 현실 세계의 객체를 프로그램에서의 객체로 사용하기위해 추상화 단계를 거친다.

이 과정은 분리수거 하는 행동과 유사하다. 우리가 분리수거를 하는 이유는 간단하다. 폐기물을 공통적인 특징을 가지고 분리하여 처리하고 동시에 최종 처분을 쉽게하기 위함이다.

프로그래밍도 이와 같다. 현실 세계의 객체를 프로그램에서 필요한 객체를 사용하면서 보다 효율적이고 쉽게 활용하기 위해 객체들을 프로그램에서 필요한지를 판단하여 이를 근거로 프로그램의 객체로 포함할지를 판단한다. 그다음 공통적인 특징을 기준으로 객체를 분류한다. 이러한 과정을 추상화라 한다.

위의 자판기의 객체를 활용하여 자판기 프로그램을 만든다고 가정해보자.

  1. 금액을 넣는다,
  2. 음료수를 선택한다.
  3. 자판기는 음료수와 잔돈을 반환해준다.

다음과 같은 프로세스를 가지고 있다. 추상화 단계 전에 수행해야 할 단계는 현실 세계의 객체를 정의하는 것이다.

현실 세계의 객체는 작은 버튼과 같은 작은 단위부터 사용자의 금액, 음료수 종류, 판매 금액 그리고 사용자 돈을 넣는 행위, 자판기가 돈을 검사하고 돈을 반환하는 과정 그 외 모든 것들이다.

그 다음 정의한 모든 객체를 프로그램에서 필요한 데이터를 만들기 위해 불필요한 객체는 식별하는 작업을 한다. 이러한 작업을 추상화라 하고 식별한 객체들은 OOP에선 속성(Attribute)과 행위(Behavior)로 구분한다.

img

정리하자면 사용자의 금액, 음료수를 속성으로 간주하여 변수로 지정하고 사용자가 돈을 넣는 행위 그 외 모든 논리적인 동작들을 메소드로 정의한다.

  • Attribute(Properties) : 데이터 타입(변수, 참조할 클래스(클래스의 실체))
  • Behavior(Operation) : 데이터의 동작 방식 정의(메소드)

클래스에 정의한 변수와 메소드 및 그 외 데이터들을 인스턴스라 하는데 이러한 클래스에 정의한 모든 인스턴스를 객체라 칭한다. 즉 프로그램에서의 객체란 클래스의 인스턴스로써 클래스라는 틀 안에 메모리에 할당된 실체, 즉 프로그램에 필요한 데이터와 그 데이터에 관련되는 동작을 모두 포함한 개념이다.

이 때문에 OOP로 프로그램을 만든다는 의미는 객체들을 만든다는 의미와 같고, 더 나아가 OOP는 객체를 만드는 것부터 시작된다고 해석할 수 있다.

추상화에 대한 착각

앞서 설명한 현실 객체를 프로그램에서 사용할 객체로 만드는 일련의 과정을 자료 추상화라 한다. 이 과정은 OOP에서 가장 먼저 수행해야 할 필수적인 단계이다.

하지만 많은 개발자는 자료 추상화에 대해 어려워한다. 이러한 생각은 예술 세계에서의 추상화와 프로그래밍의 추상화의 의미의 차이가 있다는 착각에 비롯된다.

이 착각을 벗어나기 위해선 예술 세계에서 추상화를 어떻게 표현했는지 알아볼 필요가 있다. 먼저 나는 추상화에 대한 그림을 준비해봤다. 이 그림은 추상화에 대한 어떠한 장문의 설명보다 오히려 추상화의 개념을 이해하는 데 도움이 될 수 있다.

img

위 그림은 추상화의 거장 피카소의 “화가와 바느질하는 모델”이라는 작품이다.

여기서 주의 깊게 봐야 할 점은 그림 속 캔버스이다. 얼핏 보면 기괴한 낙서를 그린 것은 아닌지 생각할 수도 있다. 하지만 이것이 바로 추상화다. 그림 속 화가는 모델을 그린 것이 아닌 바느질하는 손동작을 묘사하기 위해 직선과 곡선이라는 표현 방식으로 추상화한 그림이다.

프로그래밍도 마찬가지다. 현실 세계의 모듈을 프로그램에서 다뤄질 데이터들을 만들기 위해 객체라는 표현 방식으로 추상화한다고 생각하면 편하다.

마무리

OO(Object-Oriented)는 “객체지향”이라 부른다. 하지만 “객체지향”이라는 단어로 OO를 정의하기엔 다소 부족하다. 이 부분은 초기에 알고 있었던 OO의 개념과 후에, 실제 OOP를 사용함에서 깨닫는 개념의 차이에 있었다.

본 포스팅을 통해 OO의 개념이 “객체를 추구한다”라는 의미보단 “객체를 주로 사용하여” 또는 “객체 위주로”라는 개념에 가깝고 이 개념을 정리하면서 이 객체를 프로그램에서 사용할 데이터로 분류하는 추상화라는 개념을 정리하는 시간을 가지게 되었다.

특히, 추상화란 개념을 많은 개발자가 어려워하는데 예술 세계에서 사용하는 추상화의 개념과 별다를 게 없다는 점을 유의해야 한다.


참고

OOP Concept for Beginners: What is Abstraction?
What is data abstraction