OO 란 대체 무엇인가?
이 질문에 대해 누군가는 “데이터와 함수의 조합” 이라고 답한다고 하며 또는 이 질문에 흔히 “실제 세계를 모델링 하는 새로운 방법” 이라고들 답한다고 한다. 너무 모호하다.
OO 의 본질을 설명하기 위해 세 가지 주문에 기대하는 부류도 존재한다.
( 암요… 객체지향 하면 떠오르는거 세게 캡슐화 다형성 상속 … )
OO 를 정의하는 요소 중 하나로 데이터와 함수를 쉽고 효과적으로 캡슐화 하는 방법을 OO 언어가 제공해준다고 한다.
하지만 사실 C언어 에서도 완벽한 캡슐화가 가능하다.
struct Point;
struct Point* MakePoint(double x, double y);
double Distance( struct Point *p1,struct Point* p2);
#include"point.h"
#include<stdlib.h>
#include<math.h>
struct Point{
double x,y
};
struct Point* MakePoint(double x,double y)
{
struct Point* p = malloc(sizeof(struct Point));
p->x = x;
p->y = y;
return p;
}
double Distance(struct Point* p1, struct Point* p2)
{
double dx = p1->x - p2->x;
double dy = p1->y - p2->y;
return sqrt(dx * dx + dy * dy);
}
point.h 를 사용하는 측에서 struct Point 의 멤버에 접근할 방법이 전혀 없다. 사용자는 MakePoint 함수와 Distance 함수를 호출할 수는 있지만 , Point 구조체의 데이터 구조와 함수가 어떻게 구현되었는지에 대해서는 조금도 알지 못한다.
이것이 바로 완벽한 캡슐화이다..! OO 가 아닌 언어에서도 충분히 가능하다. 먼저 데이터 구조와 함수를 헤더에 선언하고 구현 파일에서 이들을 구현했다. 그리고 프로그램 사용자는 구현 파일에 작성된 항목에 대해서는 어떠한 방법으로도 접근할 수 없었다.
( .. 이것이.. 진정 완벽한 캡슐화인가..! )
이후에 C++ 라는 형태로 OO 가 등장했고 , C 가 제공하던 완전한 캡슐화가 깨졌다..! C++ 컴파일러는 기술적인 이유 ( 컴파일러는 클래스의 인스턴스 크기를 알 수 있어야 한다 ) 로 클래스의 멤버 변수를 해당 클래스의 헤더 파일에 선언할 것을 요구했다.
( 으아니.. C++ 은.. 그럼 완전한 캡슐화를 깬 것 아닌가..! )
class Point{
public:
Point(double x,double y);
double Distance(const Point& p) const;
private:
double x;
double y;
};
#include"point.h"
#include<math.h>
Point::Point(double x,double y)
:x(x)
,y(y)
{}
double Point::Distance(const Point& p)const
{
double dx = x - p.x;
double dy = y - p.y;
return sqrt(dx*dx + dy*dy);
}
이렇게 되면 point.h 헤더를 사용하는 측에서는 멤버 변수인 x 와 y 를 알게된다. 물론 멤버 변수에 접근하는 일은 컴파일러가 막겠지만… 사용자는 멤버 변수가 존재한다는 사실 자체를 알게된다. 이는 캡슐화가 깨진 것이다!!
public , protected , private 를 도입해 불완전한 캡슐화를 사실상 어느정도 보완하기는 했지만 이는 헤더 파일에서 멤버 변수를 볼 수 있어야 했기 때문에 조치한 임시방편 이다.
자바와 C# 은 헤더와 구현체를 분리하는 방식을 모두 버렸고 , 이로 인해 캡슐화는 더욱 심하게 훼손 되었다….
이 때문에 OO 가 강력한 캡슐화에 의존한다는 정의는 받아들이기 힘드며 실제로 많은 OO언어가 캡슐화를 거의 강제하지 않는다…..
( 그럼.. 캡슐화는 … 빠져야 하는거 아닌가..! )
OO 프로그래밍은 프로그래머가 충분히 올바르게 행동함으로써 캡슐화된 데이터를 우회해서 사용하지 않을 거라는 믿음을 기반으로 한다. 하지만 OO 를 제공한다고 주장한 언어들이 실제로는 C언어에서 누렸던 완벽한 캡슐화를 약화시켜 온 것은 틀림없다…!
( 두둥…. C++ 너마저… )