Subject

1. 객체지향(OOP)란 무엇인가?

1) 객체(Object)

객체지향은 프로그래밍을 공부하는 과정에서 만나는 큰 벽이라고 할 수 있다. 그렇기에 객체에 대해서 공부하기 위해서 이를 검색하면 흔히 ‘모든 것이 객체’라는 식의 추상적인 답변을 다수 접할 수 있다. 전혀 도움이 되지 않았다. 그렇다면, 대체 객체는 무엇인가?

나는 객체를 명확하게 구분될 수 있는 모든 대상이라 이해했다. 어떤 대상이 구분되기 위해서는 차이를 만드는 부분에 대한 비교가 필요하다. 그리고 우리는 이러한 비교의 달인들이다. 우리 인간은 무의식적으로 모든 대상을 끊임없이 비교하고, 그 결과로 얻어진 차이를 수집하여 대상을 **분류(type)**한다. 그리고 대상을 구성하는, 비교의 대상이 되는 각 항목을 **속성(trait)**이라 한다.

즉 인간은 대상을 분석하여 여러 속성을 바탕으로 분류하며, 대상(객체)을 정의한다. 그리고 이러한 인간 본연의 생각 방식을 프로그래밍에 도입한 것이 바로 객체지향 프로그래밍이다.

2) 객체지향 프로그래밍 (Object Orient Programming, OOP)

앞서 우리는 객체가 사람의 생각하는 방식이라는 점을 확인했다. 하지만, 컴퓨터는 사람과는 다른 방식으로 정보를 처리하며, 이는 사람으로 하여금 컴퓨터에 대한 고도의 이해를 요구하는 장벽이 되었다. 객체지향 프로그래밍이란 이러한 객체 개념을 프로그래밍 기법으로 도입한 것이다. 즉 코드를 보다 사람이 생각하는 방식에 가깝게 조직화 할 수 있도록한 것이다.

이러한 객체지향 프로그래밍은 흔히 class라는 문법으로 대표된다. 이하의 예는 C++의 class다.

// C++, 기초적인 class
class example 
{
private:
	int member_var1; // 1. 멤버 변수
	double member_var2;
public:
	example(){ member_var1 = 42; member_var2 = 42.4242; };
	~example(){...};
	void member_func1(int iparam) { ... }; // 2. 멤버 함수
}

// 실제 사용 방법
example test;
test.member_func1(42);
  1. 멤버 변수: 컴퓨터의 세계에서 객체란, 구분 가능한 대상이란, 곧 데이터다. 0과 1로 이루어진 일련의 비트 덩어리들은 메모리의 영역에 존재하며, 우리는 여기에 변수라는 이름을 붙여서 의미를 부여하고 조작해왔다. 이러한 변수들을 활용하면 객체를 구성하는 여러 속성 중 값의 형태로 정해지는 것을 표현할 수 있다.
  2. 멤버 함수: 객체란 행위의 주체가 될 수 있다. 여러 변수들이 객체의 정적인 속성을 표현한다면, 함수는 이러한 객체의 행위를 표현할 수 있다.

즉, 객체의 도입을 통해서 프로그램에 “의미”를 기준으로 데이터와 코드를 분류할 수 있게 되었다.

2. C언어에서 객체지향을 구현해보자 - ft_vector

1) C언어에서의 객체

C언어는 객체지향 개념의 등장 이전에 개발된 언어이다. 따라서 언어 차원에서 객체지향(class)을 지원하지 않는다. 하지만, 객체지향은 방법론이고 언어의 기능과 상관없이 추구할 수 있다. 약간의 꼼수를 통해서 C에서 객체지향을 추구해보자.

먼저 class가 데이터와 코드로 구성된다는 점에 따르면, C에서는 struct와 함수포인터를 활용하여 유사하게 따라할 수 있다. 구조체를 이용해서 데이터들을 캡슐화 할 수 있고, 함수 포인터를 그 멤버 변수로 가지게 하여 멤버 함수를 구현할 수 있다. 이 방식에 따라서 위의 C++클래스를 C에서 구현하면 다음과 같다.

// C, 구조체와 함수 포인터로 구현한 유사 객체
struct example 
{
	int member_var1;
	double member_var2;
	void (*member_func1)(struct example *this, int iparam);
}

void func(struct example *this, int iparam)
{
	...
}

// 사용 방법 예제
struct example test;
test.member_func1 = func; // 함수 포인터에 대한 별도 할당 필요함
test.member_var1 = 42;
test.member_var2 = 42.4242;

test.member_func1(&test, 42);

여기서 눈여겨 볼 부분은 멤버함수 포인터의 this 포인터이다. C++에서 모든 객체의 멤버 함수는 묵시적으로 객체 자신을 가리키는 this포인터를 첫 인자로 갖는다. C의 경우에는 컴파일러가 해당 부분에 대한 지원을 해주지 않기 때문에 위와 같이 명시적으로 this 포인터를 받아올 필요가 있다. C의 객체에서는 오직 this포인터에 대한 참조를 통해서만 객체 내부에 접근할 수 있다.

2) ft_vector