삽질의 현장/- C

곱씹어보자 C!_#024_삽잡이의 두서없이 막말하는 void*

shovelman 2015. 6. 30. 22:05

오직 내 길만 걸어간다.

뛰아갈 때도 있다... 쉬다 갈 때도 있다...

안녕하십니까 삽잡이입니다. 푸하하


오늘은 void* 에 대한 C부리기

시작합니다~


malloc은 동적 메모리를 할당할 때 사용하죠.. 이때 반환형이 void* 인것을 주목해야합니다..

포인터는 주소를 가리키죠? 그런데 말입니다. 

딱 고정되어있는 주소형을 받는 포인터가 아니어야 할 때가 있습니다...


컴퓨터에서는 자료를 다룰 일이 많습니다... 

하나하나 다 정성스레 다뤄줘야하는데... 

이를 두리 뭉실하게 '추상적'으로 다룸으로 일명 유도리있게 다룬다면,

코드의 양이 줄면서도, 수정할 필요가 적어질 수 있습니다.


즉, 뭔말이냐하면

어떤 데이터들을 다룰 때 구체적인 하나하나를 다루는 것 보다

두루뭉실하게 모든 것을 다루는 것이 확장성도 좋고 수정하기도 편하다는 것이다.


쉽게 설명해보도록 합시다... 

스타크래프트 아시죠? 드래그하면 유닛들이 선택되잖아요?

근데 우리가 마린이면 마린, 메딕이면 메딕 이렇게 같은 종류(?) 끼리 데리고 다니나요?

아니죠? 분명 마린, 메딕 쌍으로 데리고 다니고...

이게 프로그래밍 언어 관점으로 본다면, (물론 스타크래프트가 프로그래밍 언어로 짜졌죠? ㅎㅎ)

다른 구조의 형들을 하나의 자료형으로 표현할 수 있다 이겁니다.


모든 언어에는 이렇게 동시에 다룰 수 있는 매커니즘이 필요한데, 

물론 그 기반을 가지고 있고요...

절차지향 그러니 C언어에서는 모든 종류의 데이터를 한꺼번에 다룰 수 있는 

방법이 사실 없습니다. 

하지만 꼼수는 있죠... 그것이 바로 void* 입니다.


한마디로 int형이던 double이던 모든 데이터를 한꺼번에 담고싶다면

void* 를 사용해야한다 이거죠...


포인터는 주소만 가리키잖아요? 크기 상관없이? 

하지만 포인터가 어떤 형식이냐에 따라 접근하는 방법이 달라지는데요...

음... int* 는 int형 주소, double*은 double형 각 데이터에 맞게만 담을 수 있잖아요...

근데 중요한건 어떤 형식이든 4 byte라는 거에요... 

어떠한 형식의 자료던지 다 담을 수 있는 포인터 형식이 정해져있지 않은 포인터 

그게 바로 void* 입니다.


이 void*를 사용하기 위해 주의해야할 점은...

포인터형 변수는 주소를 담을 수 있지만 어떤 주소인지 알 방도가 없다는 거에요...

하지만, 담아놨던 주소가 어떤 주소인지만 안다면 형식 변환을 통해 사용할 수 있게되죠...


즉, 알고 있다는 전제하에 사용할 수 있다 이거에요...


주소가 어떤 형의 주소인지만 안다면 void*를 사용할 수 있다는 거죠...