이번에는 예정대로 포인터의 포인터에 대해 알아보도록 하자. 포인터의 포인터란 개념 역시 '왜 이걸 써야 하는가?' 라는 맥락이 머릿속에 확실히 들어가 있지 않으면 이해하기 쉽지가 않다. 예를 들어보자.

---------------------------------------

요즘엔 인터넷에서 재미있는 자료를 찾아보는 것이 삶의 낙중 하나이다. 재미있는 자료의 근원지는 디시인사이드, 웃긴대학 등등 여러가지가 있다. 그런데 하루에도 수백, 수천개의 자료들이 올라오다보니, 그런 재미있는 사이트에 있는 재미있는 게시물에 대한 링크만 엄선해서 모아주는 '레임프루프'라는 게시판이 있다는 것을 알게 되었다. 그 게시판에 있는 모든 내용물은 다른 사이트의 게시물에 대한 링크들만 담겨있다. 당신은 그 게시판을 알게 되서, 역시 친구에게 권해주려고, 그 게시판의 링크를 메일로 써서 보내주었다.

당신의 친구는 메일을 받아서, 그 메일에 있는 링크대로 따라 들어갔다. 거기에 있는 게시판에 있는 링크를 다시 따라들어가서 자료들을 볼 수가 있었다.

메일 -> 레임프루프 -> 디시
                            -> 웃긴대학
                            -> 기타등등

---------------------------------------

이것이 '포인터의 포인터'의 개념이다. 예전에 설명한 포인터가 1 회의 간접억세스(indirection) 의 효과가 있는 것이었다면, '포인터의 포인터'는 2 회의 indirection 의 효과가 있는 것이다. 메일 안에 있는 링크를 따라들어가는 것이 첫번째 indirection 이고, 게시판 안에 있는 게시물을 따라서 디시인사이드나 웃긴대학의 링크로 따라가는 것이 두번째 indirection 이다.

마찬가지로 '포인터의 포인터의 포인터' 의 개념도 똑같다. 막상 링크를 따라 들어갔는데 거기에서도 마찬가지로 '딴지일보' 같은 다른 곳을 링크하고 있는 경우도 많이 있다.

메일 -> 레임프루프 -> 디시인사이드 -> 딴지일보

사실상 포인터가 다시 포인터를 몇번까지 가리킬 수 있는 가에 대해서는 생각할 필요가 없다. 또한, 무한히 포인터가 포인터를 가리키는 경우를 응용해서 자료구조를 만들 수 있다. 예를 들면 링크드 리스트가 그 대표적인 예이다. 인터넷에서 링크드 리스트와 비슷한 역할을 하는 것은 웹링을 들 수 있다. 하나의 사이트가 다음 사이트를 지정하고 있고, 그 사이트는 다시 다음 사이트를 지정하고 있고.. 하기 때문에 이론상으로는 중앙에서 모든 사이트들의 정보를 관리하지 않아도 얼마든지 자율적으로 무한히 사이트가 늘어나거나 뺄 수 있게 되어있는 것이다.

포인터를 사용하는 것은 여러가지 유동적인 구조를 만들 수 있지만, 간접억세스를 늘 해야 한다면 매우 귀찮은 일이 된다. 예를 들어서 처음에 든 예처럼, 메일에 있는 링크를 통해서 게시판에 있는 링크를 통해서 게시물을 본다고 할때, 바로 다음 게시물을 보려고 할때, 굳이 처음부터 다시 메일에 있는 링크부터 누를 필요는 없을 것이다. 다음에 다시 게시물을 본다고 하면, 이미 열려있던 게시판 홈페이지에서 다음 게시물을 직접 누르거나, 게시판 홈페이지를 즐겨찾기에 등록하는 것으로 충분할 것이다.

before)
메일 -> 레임프루프 -> 디시인사이드
                                웃긴대학

after)
레임프루프 -> 디시인사이드
                    웃긴대학

이렇게 되면 실질적으로 '포인터의 포인터' 에서 그냥 '포인터' 로 하나의 indirection 이 줄어든 셈이 된다. indirection 은 많아질 수록 억세스하는 속도가 느려지고 불편하기 때문에, 중간 단계나 최종단계의 전단계 포인터를 미리 기억해두는 것이 일반적이다.

----------------------------------------------------

이번에는 '포인터의 배열' 에 대해 생각해보자. 이것의 대표적 예는 어떤 것이 있을까?

여러분의 인터넷 브라우저에 있는 '즐겨찾기' 라는 기능은 링크들의 모음이라고 할 수 있다. 여러분이 링크하고 싶은 것이 하나만 있는 것이 아니기 때문이다. 복수개의 자료는 배열을 통해서 구현할 수 있다

내 컴퓨터의 즐겨찾기

즐겨찾기1 -> 레임프루프
즐겨찾기2 -> 플립코드
즐겨찾기3 -> 코드구루
즐겨찾기4 -> 기타등등

imcgames 의 김학규입니다