오늘은 포인트 변수에 대해서 알아보도록 하겠습니다. 포인트에 대해 내용은 책한권이 나올 정도로 방대합니다. 과거 대학도서관에 포인트에 대한 내용으로만 채워진 책한권을 본적이 있는데 내용이 장난 아니게 설명이 되어 있더군요. 포인트에 대한 방대한 이야기를 하자면 끝도 없고 초보분들에게는 사실 조금만 깊게 들어가면 네가 이 C언어를 공부를 꼭 해야 하는가 하는 생각에 포기 할 가능성이 큽니다. 입문자 분들은 포인트 내용에 너무 깊게 들어 가지 말고 기초 내용만 정리하시면 됩니다. 나중에 c언어가 어느정도 친숙해 졌을때 C언어 전문 서적을 구매하셔서 본격적으로 공부하시면 됩니다. 지금은 단지 C언어의 기초를 배우면서 즐기시면 됩니다.
그러면 포인트 변수에 대해 출발해 봅시다.
포인트 변수에 대해 간단히 아래와 같이 그림으로 만들었네요.
C언어 변수라는 것은 메모리 주소의 이름입니다. 메모리 주소를 직접 사용한다면 "0X62fe20"라는 이름으로 접근한다면 코딩 할 때 저 16진수가 뭘 지칭하는지 알기 어렵습니다. 그래서 C언어에서는 메모리 주소를 변수라는 이름으로 사용하여 접근하게 됩니다.
위 그림에서 보시면 a라는 변수의 주소는 "0X62fe20" 입니다. 그리고 "0X62fe20"라는 주소지에 10이라는 값이 저장되어있습니다.
변수는 여기까지 이해 하셨죠.
그러면, 포인트 변수는 약간 다릅니다. a변수는 a주소에 바로 10이라는 값을 저장 되지만 p라는 주소지에는 a라는 주소값이 저장 됩니다. 쉽게 말해서 포인트 변수는 특정 주소지값을 저장하는 변수라고 생각하시면 됩니다.
포인트변수에 저장된 값은 값이 저장되는게 아니라 주소지가 저장된다고 개념을 잡아 주세요. p라는 변수는 컴퓨터가 알아서 주소를 잡아주는 거고 그 주소에 특정 주소값이 저장됩니다.
그리고 포인트(*)는 p에 저장된 주소지를 가리키라는 의미입니다. 위 식을 보시면 다음과 같습니다.
int a=10;
int *p;
p=&a;
a라는 주소지에 10이 저장되어 있고. p변수에 a의 주소값을 저장하는 코딩입니다. 이렇게 하면 포인트 p변수가 가리키는 주소지는 a의 주소지가 됩니다. a와 p는 같은 주소지를 가리키는 것이죠.
결과는 a변수의 주소지는 "0X62fe20"이고 포인트 p의 값은 "0X62fe20"로 주소지가 공유되게 됩니다.
a가 20으로 변경하면 *p의 값도 20이 됩니다. 같은 메모리주소지를 a, *p가 가리키기 때문이죠.
그러면 실제 코딩으로 포인트 변수의 결과를 살펴 볼까요.
[소스]
#include
int main(int argc, char *argv[]) {
int a=10;
int *p;
p=&a;
printf("주소지 a=%x, *p=%x \n",&a,p); //같은 주소지인지 확인
printf("값 a=%d, *p=%d \n",a,*p); //주소지 공유시 같은 값 확인
a=20;
printf("값 a=%d, *p=%d \n",a,*p); //a값을 바꾸면 *p도 바뀐지 확인
*p=30;
printf("값 a=%d, *p=%d \n",a,*p); //*p값을 바꾸면 a값도 바뀐지 확인
return 0;
}
주석을 달았으니 주소지를 공유하면 위 과정대로 했을 때 같은 값이 나온지 실행해 봅시다.
[결과]
대충 느낌을 아시겠지요.
int *p=10;
위와 같은 표현을 할 수 없습니다. p라는 변수에 저장되는 주소값을 자동을 잡을 수 없습니다.
포인트 변수는 왜! 쓰는지 궁금하실 거에요. 포인트 변수를 보면 포인트 변수 자체의 주소지는 컴퓨터가 잡아주고 그 주소지에 포인터 변수가 가리키는 주소지를 값을 저장하고 그 값을 *로 가리킴으로써 해당 주소지에 저장된 값을 불러 오는 방식입니다. 즉, 값이 저장된 주소지를 값으로 저장하는 변수입니다. 언뜻 보면 한다리 건너서 접근하는 방식이지요. 보면 참 불편한 변수처럼 보일꺼에요.
포인트 변수를 쓰는 이유는 뭘까요. 바로 할당과 해제를 할 수 있다는 점입니다. 즉, 일반변수는 프로그램일 실행하면 그때 메모리주소의 공간을 잡고 프로그램이 종료 될때까지 해당 메모리주소지 공간읍 잡고 있습니다. 일반변수가 많은 데이터 양의 변수로 메모리를 잡아 먹는 다면 메모리 사용량이 많아 지겠죠. 쉽게 설명하자면 게임을 하다보면 어느순간 메모리 사용량이 처음 게임을 할 때에 비해 많이 잡아 먹고 있는 것을 보실 수 있을 거에요. 게임 내 사용되는 변수가 메모리를 잡아 먹고 그 변수들이 계속 누적되어 어느순간 컴퓨터는 메모리 렉이 걸리고 게임이 느려지는 것을 종종 느끼셨을 거에요. 그처럼 프로그램이 시작하고 종료 될때까지 일반변수가 메모리를 잡아 먹게 됩니다.
하지만 포인트 변수는 프로그램이 실행과 동시에 메모리를 잡아 먹는 것이 아니라 포인트변수가 사용 될 때 메모리를 할당하여 잡아먹고 필요 없을 때 해제함으로서 해당 메모리를 해제할 수 있습니다. 게임을 보면 어느순간 메모리 사용량이 늘었다가 다시 메모리 사용량이 줄어 들때가 있죠. 이처럼 포인트변수로 게임 변수를 사용할 때는 할당하고 사용하지 않을 때는 해제함으로 메모리 사용을 융통성 있게 관리하게 됩니다. 포인트 변수의 가치를 아시겠지요.
그리고 포인트 변수는 사용자 정의 함수를 만들 때에도 유용하게 사용합니다. 사용자 정의 함수로 인자를 넘겨줄 때 주소지를 넘겨주면 사용자 정의 함수 안에서 처리 될 때 해당 인자값이 갱신이 되면 메인함수 내에서 해당 변수도 자동으로 갱신됩니다. 사용자 정의 함수는 하나의 값만 반환 할 수 없기 때문에 여러개의 값을 수정 할 때 그 값을 반환하기 위해서 포인트 변수로 이용하여 주소지를 공유하게 되면 여러개의 값을 반환 시킬 수 있습니다. 이부분은 나중에 사용자 정의 함수 편에서 다루니깐 지금은 깊게 생각하실 필요가 없습니다.
오늘은 포인트 변수를 선언하고 주소지를 공유하는 개념만 이해하시면 충분합니다.