포인터는 자료형이다
정수형 자료형 int, 문자형 자료형 char… 프로그래밍을하면서 참 많이 보는 것들이다. 이런것들을 자료형이라고 한다. 자료의 형태라는 것인데… 포인터도 자료형일까?
개인적인 생각으로는 자료형이라고 생각한다. 단지 int가 정수를 값으로 사용하고 char가 문자를 값으로 사용하는 것처럼 포인터 자료형은 주소 를 값으로 사용한다. 즉, 주소값을 저장하기 위한 메모리 공간일 뿐이라는 것이다. 모든 포인터타입은 4바이트(32bit 컴퓨터 기준, 64bit는 8바이트 크기)이다.
포인터는 왜쓰지?
옛날에 프로그래밍을 처음 공부하면서, 포인터를 왜쓸까? 라는 의문을 가진적이 있다. 지금와서 생각해보면 참조하여 사용하기 위해서가 아닐까 생각한다. 예를 들어, 몬스터 모델링 정보를 저장하는 구조체가 있다고 가정하자. 이 정보에는 정점 정보, 노멀값, uv좌표, 애니메이션 정보 등의 방대한 정보를 내포하고 있을것이다. 몬스터 객체들은 각각 모델링 정보가 있어야 렌더링이 된다. 음… 모든 몬스터가 같은 모델링 정보를 사용하는데 단순히 모델링 정보구조체를 각각 포함하고 있다면? 메모리가 참으로 유감스럽지 않을까 싶다.
어차피 모델링 정보를 공유할수 있다면, 각 객체가 정보를 복사해서 가질 필요 없이 참조 만 하면된다. 해당 모델링 구조체의 포인터를 사용해서 말이다. 모델링 정보를 하나만 할당해놓고 각 객체가 모델링 구조체의 포인터를 통해서 참조만 한다면 메모리 낭비없이 마치 각각 모델링정보를 가지고 있는 효과를 낼수 있다. 이처럼 참조는 강력하다. (모델링 정보가 4바이트 혹은 8바이트보다는 크지 않겠는가?)
4바이트(혹은 8바이트)의 메모리 공간만으로 더큰 메모리를 참조하여 사용할 수 있게 해주는게 포인터를 사용하는 이유가 아닐까 생각한다.
포인터 자료형이 다양한 이유
int, char 처럼 다양한 형태를 보았을 것이다. 사실 저것은 다 같은거다. 모두 주소값을 저장하는 메모리 공간이고, 실제로 크기를 측정해보면 4바이트로 동일하다.(32bit 컴퓨터의 경우) 그렇다면 왜 굳이 저렇게 여러 형태가 존재할까? 예를 하나 들어보자.
4바이트 구조체(A), 12바이트 구조체(B) 인스턴스가 각각 할당되어 있다고 가정하자 만약 포인터의 자료형타입이 나뉘지 않고 통일되어 있다면? 4바이트의 포인터 메모리 공간에는 A와 B의 주소값이 저장되므로 문제없이 참조할 수 있을것이다. 과연 그럴까? A 구조체는 4바이트를 읽어야 사용할거고 B는 12바이트를 읽어야 사용할텐데 포인터는 메모리주소만을 알고 있을뿐 얼마나 읽어야 할지는 모른다.
즉, 포인터의 자료타입이 다양한 이유는 포인터가 얼마만큼의 크기를 읽어야 하는지를 알기 위함이다. 다른 예로, 포인터를 사용하여 8바이트의 실수형값을 4바이트메모리 공간에 쓰면 짤리지 않겠는가? 이건 정상이 아니다.