두번째 포인터 시간이다. 포인터의 또 다른 용법에 대해 설명을 하도록 하겠다. 다른 예를 들어보겠다.

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

이번에 레임프루프에서는 신년을 맞이하여 몇몇 회원들이 신년회 번개를 하기로 했다. 6 시에 신천역에서 모이기로 했는데, 예약을 하지 못했기 때문에, 모인 다음에 어디로 갈 것인지에 대해서는 미리 정하지 않은 상태였다. 그래서 다음과 같이 약속을 정하였다.

'6 시까지 신천역 4 번출구에서 모입니다. 이동할 곳이 정해지지 않은 관계로, 6 시이후에늦게 오신 분을 위하여, 신천역 출구 앞에 있는 게시판에다가 사람들이 어디로 갈 것인지 커다랗게 써서 붙여놓기로 했으므로, 이후에 오신 분은 게시판을 보고 찾아오시기 바랍니다'

6 시에 모인 사람들은 어디로 갈까 하다가 근처에 있는 '신천호프' 로 가기로 했다. 그래서 사람들은 게시판에다가 '레임정모 신천호프로 오세요' 라고 글을 남겨놓고 신천호프로 갔다.

그 후에 온 회원들은 약속대로 게시판을 보고 신천호프로 찾아왔다. 이윽고 자리가 무르익자 2 차를 가기로 해서, 신천 노래방으로 향했다. 그 이후에도 새로 올 사람이 더 남아있었기 때문에 모임의 주최자인 라라미아님은 신천역 앞의 게시판에 있는 '신천호프로 오세요' 라는 글을 '신천 노래방으로 오세요' 라고 바꿔달았다.

그 이후에 도착한 회원들은 역시 게시판을 보고 신천노래방으로 찾아올 수 있었다.

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

요즘에는 다들 핸드폰을 많이 갖고 있어서 이렇게 까지 할 필요는 없지만, 핸드폰이 없던 시절에는 꽤 유용하게 쓰였던 방법이다. 그리고 이러한 방법 (indirection) 은 역시 포인터의 용도와 통하는 바가 있다. (물론 핸드폰으로 물어보는 것 자체도 또 다른 하나의 indirection 방법이라고 할 수 있다)

강좌 1 에서 설명했던 포인터의 용도는 크기가 큰 데이타를 넘길 경우(동영상 게시물), 또는 데이타의 결과가 똑같이 영향을 받아야 할 경우 (게시물 덧글) 에 함수간 전달을 하는 용도였지만, 이번에 설명하는 용도는 복수개의 개체를 지정하는 것을 처음에 어디로 지정할지 알 수 없는 경우에 사용된다 (late binding)

여기까지 잘 읽은 사람은 알 수 있겠지만, 신천역 출구에 있는 게시판은 '포인터' 의 역할을 하고, 신천 노래방과 신천호프는 포인터에 의해 지정되는 대상이 된다.

사람들에게 직접 노래방으로 가고, 호프로 가라는 얘기를 처음부터 하지 못했던 이유는 물론 처음에는 어디로 갈지 알 수가 없었기 때문이다. 마찬가지로 프로그램 안에서도 뭔가 대상을 지정해야 하는데, 대상이 무엇이 될지 알 수가 없는 경우가 많이 있다.

예를 들어서 라그나로크에서 네이팜 비트라는 마법을 이용해서 적을 공격하는 부분을 프로그래밍 한다고 생각해보자. CastNapalmBeat 라는 함수가 있다고 하고, 각각의 몹들이 구조체를 이용해서 정의되어 있다고 할때, CastNapalmBeat 는 어떤 적을 가리켜야 할까? 물론 그런 것은 프로그램을 짤 당시에는 알 수 있을리가 없다. 어떤 적을 가리킬 것인가는 유저가 플레이를 하면서 마우스로 정하게 되는 것이기 때문이다. 그렇기 때문에 CastNapalmBeat 같은 함수에서 상대를 지정하는 부분은 반드시 포인터를 사용하여 구현하게 되어있다. 예를 들면 다음과 같다

void  CastNapalmBeat(Player *player, Enemy *e)
{
    if (e->속성 == 마법저항)
        return;   // 마법 저항에게는 효력이 없다
    else {
        e->energy -= player->napalmBeatSkillLevel*player->int*10;  // 적의 에너지를 닳게 한다
        player->sp -= 10;                                                              // 플레이어
    }
}

이제 CastNapalmBeat 라는 함수를 쓸 때 인자로 들어갈 player, 나 e 에는 그때 그때 상황에 맞춰서 마우스가 클릭한 구조체를 찾아서 넘겨주면 된다.

다시 정리하자면, 포인터는 동적으로 가리킬 대상을 바꿀 수 있기 때문에, 처음에 대상이 고정적으로 정해지지 않은 로직에 쓰이게 된다.

이상 포인터의 두가지 주요한 용도에 대해 알아보았다. 다음에는 포인터의 포인터와 포인터의 배열로 넘어가기로 하자.

imcgames 의 김학규입니다