C / C++ 언어의 문제아가 바로 이 포인터라는 사실은 누구나가 다 알고 있다.
문법책을 보면 누구나가 다 알 수 있고 이해할 수 있는게 포인터라는 넘이다.
근데 왜 어려울 수 밖에 없는가...

('*' 요넘이 바로 포인터다)

예를 들어보자.
누누히 강조하지만 포인터는 리모컨과 똑같다고 할 수 있다.
만능 리모컨을 가지고 조작하는 넘인데.. 얼마나 똑똑하냐면, 조작하고자 하는 제품을 대입시키기만 하면 리모컨에 자동적으로 조작가능한 기능의 버튼들이 쑥쑥 생겨난다.
단, 어떤 제품을 사용할 지 미리 선언해 두어야 하는데 이렇게 선언 한 이후에는 제품에 상관없이 사용이 가능한 만능 리모컨이 되어 버린다.


그럼 TV를 조작할 수 있는 리모컨을 하나 만들었다. (프로그램의 세계에선 그냥 선언만 하면 된다)
그 리모컨에 LG TV를 가리키도록 설정하였다. 그러면 이제부턴 그 LG TV가 조정이 가능하다.
근데 안방에 있는 TV는 삼성 TV였다. 그렇다면 리모컨이 삼성 TV를 사용하도록 설정 해 주면 되는 것이다.
이러한 동작을 하는 넘이 '&'기호를 사용하는 레퍼런스란 놈이다. 예를 들어 볼까?


TV* 만능티브이리모컨;

만능티브이리모컨 = &LG티브이;

만능티브이리모컨->TV켜기;
만능티브이리모컨->채널9번으로변경;



만능티브이리모컨 = &삼성티브이;

만능티브이리모컨->TV켜기;
만능티브이리모컨->SLEEP설정(30분);



에어컨* 만능에어컨리모컨;
에어컨 = &휘센에어컨;


쉽다. 정말 쉽지 않은가?
C 언어의 포인터에 대해서 쥐꼬리만큼이라도 읽어 보았다면 위 내용이 무엇을 의미하는지 알 것이다.
또한 위의 예제만 봐도 왜 포인터를 사용해야 하는지에 대해서 개념을 잡을 수 있을 것이다.

자, 그럼 이제 무엇이 그토록 포인터를 질리게 만드느냐를 따질 차례다. 도대체 뭐가 문제지???

그렇다. 포인터는 바로 무지무지 위험하기 때문이다.
포인터는 프로그램이라는 가상의 공간을 단 한 번의 실수로 깨뜨려먹을 수 있다.

위의 예를 좀 이어서 설명 해 보자.
우선 전지전능하신 내가 '집' 이라는 가상의 공간을 프로그래밍 했다.
그 집 안에 있는 제품들을 가상 주인공이 사용하기 위해서 미리 제품들을 배치 해 두고, 그 제품들을 편하게 사용할 수 있도록 만능 리모컨을 하나 만들었다.

자, 이제 안방 TV를 보기 위해 안방 TV를 만능 리모컨에 대입했다.
근데 이런!.. 잠시 화장실을 갔다 온 사이 같이 지내던 여친이 나랑 싸우고 나서 TV를 밖에다 던져서 박살을 내 놓은 것이 아닌가!
나는 그것도 모르고 습관대로 안방에 문을 열자마자 TV를 확인하지도 않고 Power 버튼을 눌렀다.
어찌될까? 바로 그 가상의 집이 날아가버린다고 생각하면 된다.

정말 위험하지 않은가?

문제는 또 있다. 포인터가 받을 수 있는건 TV나 에어컨 뿐만이 아니다. 에어컨, TV. 냉장고, 보일러 등을 다 가지고 있는 '집' 이란 넘도 관리할 수 있는 리모컨을 만들 수 있다.
이러한 개념으로 살펴보면 멀리 나아가 '행성'이라는 리모컨도 만들 수 있으며 이 행성 리모컨에 '지구'를 받기만 하면 거의 전지전능한 신의 수준으로 지구를 컨트롤 할 수 있다.
그런데 이러한 '지구' 리모컨을 생성했더니 버튼 수가 장난이 아니다. 이건 신의 입장에서도 관리할 수 없는 숫자의 버튼들이 생겨버린 것이다. 그래서 지구 리모컨의 버튼 하나는 다른 리모컨으로 변신할 수 있는 또다른 버튼 하나를 할당할 수가 있다. 여기에다가 '국가' 라는 이름을 달았다.
이 버튼을 누르게 되면 갑자기 이 만능 리모컨이 휘리릭~ 하고 바뀌며 국가를 컨트롤 할 수 있는 리모컨으로 바뀌게 된다.
바로 여기에서 컨트롤 안의 컨트롤, 즉 포인터의 포인터 개념이 생기게 되고 이제 이노무 만능 리모컨이 더 이상 친절한 도구가 아닌 사람을 환장하게 만드는 도구가 되기 시작한다.


그럼에도 왜 사용하려는 것일까?

여러분의 집을 생각 해 보라.
모든 기기가 리모컨이 없을 때 얼마나 귀찮아질 지 생각 해 보면 된다.
일일이 움직여서 모든 기기를 조작해야 한다면 정말 귀찮다.
즉, 포인터는 이러한 불편함을 줄여주는 희대의 발명품이라 할 수 있는 것이다

그치만, 실제로 프로그램에서 사용할 때는 위와 같은 단세포적인 이유로 사용하는 것은 아니다.
프로그래밍 안에서는 거의 신의 존재라고 했다. 단순하게 모든 TV가 그 장소에 있는 것이 아니라, 주문을 받으면 새로운 TV를 만들어서 사용이 가능하게 해 주기도 해야 한다.
이럴 때 만약 포인터 개념이 없다면 도대체 프로그램을 어떻게 만들어야 할 지 감이 잘 오지 않게 된다.


이제 결론은 하나다. 개념만 잘 잡고 포인터를 잘 관리 해 주기만 하면 된다.
정 포인터가 싫다면 포인터를 사용하지 않는 프로그래밍 녀석들을 배우면 된다. 주변에 널려있다.

그래도 포인터를 배우려면 다음의 4 줄을 꼭 외우자.


'*' 포인터란?
주소값을 담을 수 있는 변수이다.

그럼 주소값을 알고 싶을 때는?
'&' 레퍼런스를 사용하면 된다.

(참고로 주소값이란 메모리 번지의 주소이다)
앞으로 위의 개념으로 모든것을 이해하려 노력하고 포인터에 대해서 바라보기 바란다.
포인터는 위의 개념을 벗어날 수 없다. 그러므로 모든 문법책에서 포인터에 대한 설명이 쉬울 수 밖에 없다.
단지, 아래에선 그넘을 사용하면 어떻게 되는지, 실제에선 대충 어떻게 사용하는지에 대해서 설명을 해 보도록 하자.

참고로 이 설명방식은 그냥 내가 생각하기에 이해하기 편할 것 같아 정리 한 내용이다.
100% 만족스러운 설명은 되지 않겠지만 나름 이해하기 쉬울 것 같아 정리한 내용이며 만일 틀린 내용이 있을 경우 반드시 지적 해 주기 바란다.

- 다음 편에서 계속
Posted by hopi
,