2022. 7. 6. 23:15ㆍC
오늘은 포인터를 하려면 꼭 알아야 하는 메모리 구조에 대해 알아보도록 하겠습니다.
메모리의 구조
여러분이 흔히 RAM이라고 하는 장치의 정식 이름은 랜덤 액세스 메모리 (Random Access Memory), 직역하면 무작위 접근 기억장치입니다. 이러한 이름이 붙게 된 이유는 바로 RAM의 구조에 있습니다.
다음 표는 RAM의 구조를 형상화한 것입니다.
0x000001 | 0x000002 | 0x000003 |
0x000004 | 0x000005 | 0x000006 |
0x000007 | 0x000008 | .......... |
각 칸에 0x로 시작하는 괴상한 숫자들이 있습니다. 이는 각 메모리 위치의 주소로, 16진수로 표현됩니다. 16진수의 대표적인 예는 바로 컴퓨터가 색상을 나타낼 때 사용하는 HEX RGB 코드가 있죠. 여기서 HEX가 영어로 16진수를 뜻하는 HEXademical의 준말입니다.
어쨌거나, 이 RAM은 CPU와 캐시라는 것을 통해 정보를 주고받으며, 정보를 저장합니다. 이때, 정보는 이 RAM의 아무 위치에나 저장되는데, 여러분이 코딩을 하면서 만든 변수나 배열 등도 그렇습니다. 그리고, C언어는 다른 대부분의 언어와 달리, 컴퓨터의 메모리에 자유롭게 접근 할 수 있는 기능이 있습니다. 이것이 우리가 앞으로 배울 포인터와 메모리 동적 할당입니다.
메모리 주소
여러분이 변수 a 를 만들었다고 가정합시다.
int a = 0;
그러면 이 변수의 값인 0은 여러분 컴퓨터의 RAM 어딘가에 저장됩니다.
그 주소를 한번 출력해볼까요?
printf("%p", &a);
어떤 결과가 나왔나요?
위에서 보았던 메모리 주소와 비슷한 형태의 출력이 돌아왔습니다.
저는 0x7ffe535edf9d이 나왔네요.
그럼 바로 위의 코드를 한번 자세히 알아볼까요?
printf() 까지는 알겠는데 그 안에 있는 "%p"와 &a 는 무엇일까요?
%p 는 앞선 강좌에 잠깐 다루었었는데, 포인터 주소의 형식 지정자입니다.
&a의 & 는 포인터로, 변수 a의 주소를 가져옵니다.
쉽게 설명해 볼까요?
당신의 친구 A는 이번에 당신이 사는 동네로 이사를 왔습니다.
그래서 A는 당신을 집들이 목적으로 그의 집에 초대했습니다.
A는 당신에게 집 주소를 문자로 줍니다.
그리고 당신은 그 주소를 찾아갑니다.
많고 많은 집 중에 당신은 A가 준 주소를 찾아 A의 집에 간 것이죠.
포인터도 마찬가지입니다.
당신의 컴퓨터 RAM 이라는 동네에 있는 특정 정보의 집을, 그 주소를 이용하여 찾아가는 것이죠.
이때, 그 주소를 가리키는(point) 것, 그게 바로 포인터(pointer)입니다.
그렇다면 왜 포인터를 알아야 할까요?
포인터는 프로그래머인 여러분들을 코딩의 한계에서 자유롭게 해주고, 코드의 질을 높혀주며, 프로그램의 자원 사용을 줄여주기 때문입니다. 지역 변수 등의 한계에 구애받지 않고, 메모리상에만 있다면 어느 정보든 찾아 갈 수 있기 때문입니다.
포인터는 C언어의 꽃이라고 불립니다.
그래서 다음 강좌에서는 포인터에 대해 알아보도록 하겠습니다.