C++ 2D subscript overloading using typecasting.

C++에서 연산자오버로딩을 이용하면 코드의 가독성을 좋게 만들 수 있고, 좀 더 편하게 객체를 사용할 수 있게 된다.
예를 들어 Array 클래스가 있을때,

Array array;
....
n = array.get(10); // 1
n = array[10]; // 2

두 가지 방법중 subscript overloading을 이용한 2번 방법이 보기 편하고 직관적일 것이다.

만약 2D subscript overloading, 즉 [][] 연산자를 overloading하려면 어떻게 해야할까?
실제로 [][] 연산자는 존재하지 않고, [] 가 2번 연산된 것으로 처리된다.
따라서 이를 수행하려면
http://stackoverflow.com/questions/6969881/operator-overload
와 같이 Proxy Class를 이용해야한다.
Proxy객체를 이용하면 생성하고 초기화하고 소멸하는 등에 대한 추가적인 overload가 든다.
오늘 그래서 내가 생각해낸 방식이 Imaginal Proxy Class 라는 방법이다. (이름은 내가 지었다..)
Proxy Class는 사용하되 객체는 생성하지말고, type casting을 이용해 Proxy Class의 subscript operator만 사용하게끔하는 것이다.

아래가 그 예이다.

음?? 왜 이거 짤때 *reinterpret_cast<PixelArray*>~~ 이런식으로 했지?? 포인터쓸 필요없이, 그냥 레퍼런스 이용해서 reinterpret<PixelArray&>(data[idx * width]) 이런식으로 하면 됩니다 ㅋㅋㅋㅋ

위에서 PngImage가 우리가 2D subscript operator overloading을 하려는 대상이고, PixelArray가 그 것을 위한 Proxy Class이다. PngImage::data에 pixel정보들이 차례로 나열되어 있다.
Image와 PixelArray의 operator[]를 보면 typecasting을 요령껏 사용해서 객체 생성없이 2D subscript operator overloading을 하는 것을 볼 수 있다.
3D, 4D, ... 에 대해서도 적용할 수 있다.

개인적으로 몇 마디를 덧붙이면, 위와 같은 것들이 가능하기 때문에 C++이 재밌고 매력있는 언어인 것 같다. JAVA는 객체지향이 훌륭하지만 다양한 구현이 불가능하다고 난 느꼈다. C는 오히려 문법적인 제약 (객체지향등의 미지원) 때문에 '언어적으로' 다양한 구현이 불가능하다. C++은 그 두가지 모든 것을 동시에 충족시키는 언어같다. JAVA처럼 깔끔하고 체계적으로 코딩할 수 있고, C처럼 모든 것을 할 수 있다. 그리고 JAVA, C#, Python같은 대세 언어들의 경우 가상머신위에서 동작하거나 인터프리터에 의해 실행되기 때문에 그 내부의 동작 흐름을 완전히 파악하는 것이 불가능하다. 하지만 C++은 native언어이기 때문에 적은 노력으로도 C++ code를 assembly단에서 분석할 수 있는 희열을 맛볼 수 있다. 즉 C++ code를 보고 assembly code를 상상할 수 있기 때문에 performance를 끌어올릴 수 있다. 그렇기에 코딩이 고된가보다. C++은 어렵지만 강력하다! 그리고 재밌다!


댓글