INDEX
1. 변수
"변수란 값을 저장(기억)해 놓는 기억공간이다."
변수는 말로 설명하기 힘들 정도로 프로그램에 있어서 너무 중요한 요소이다. 변수가 있기에 연산이 가능하고 변수가 있기에 원하는 값들을 저장할 수 있다. 어떤 특정 값(문자, 문자열, 정수, 실수 등)을 추상적인 기호 (숫자로 시작하지 않고 알파벳, 언더 스코어, 숫자)에 담을 수 있기에 인간이 하기 힘든 일들을 많이 해줄 수 있는 것이다. 그렇다면 변수란 정확히 무엇이고 어떤 방식으로 작동할까?
2. 공간 할당
변수에는 두 가지 요소가 기억되어야 한다. 하나는 메모리 주소이고 다른 하나는 데이터의 길이와 형태에 대한 정보이다.
메모리 주소가 0x1, 0x2,0x3,0x4,0x5... 이런 방식으로 나열되어 있고 변수의 크기가 4 바이트라면 0x1 ~ 0x4까지의 자리를 차지하게 된다. 이때 변수의 이름은 첫 번째 메모리인 0x1 만 가리킨다. 따라서 C언어에서 변수 a와 b를 선언하게 되면(int a=1;와 int b=2;) 두 변수 a, b의 주소 차이는 4가 되는 것이다.
즉 변수의 선언은 공간의 할당인 것이다.
3. 자료형
변수에는 자료형이 존재한다. 자료형은 정수형(char, short, int, long) 실수형(float, double, long double)이 있다. 이름 그대로 정수형은 소수점 표기가 없고 실수형에만 존재한다. 하지만 존재하는 이유는 뭘까? 그냥 숫자는 실수, 문자형은 문자로 묶으면 더 편하지 않을까? 아래는 자료형이 나뉘는 이유 다섯 가지에 대해 설명한다.
- 자료형을 미리 알고 있으면 분석 처리 과정이 수월하다. 예를 들어 이 데이터 세트의 특정 열은 문자형만 저장하고 있다는 사실을 알고 있다면 사칙 연산이 불가능하다는 것을 미리 알 수 있다.
- 데이터 자체에 의미를 부여해준다.
- 컴파일러가 코드에서 오류를 찾을 때 더 찾기 수월하게 도와준다.
- 자료형을 미리 명시해 주면 untyped, dynamically typed 언어와 달리 어떤 자료형인지 파악하는 데에 이용되는 비용이 없다.
- 각 자료형은 메모리에서 요구하는 크기가 다를 수 있다. 따라서 데이터 유형을 나누면 메모리 사용을 최적화할 수 있고 메모리 공간을 효율적으로 활용할 수 있다.
4. void
이제까지 자료형의 종류와 효과에 대해 알아보았다. 하지만 자료형의 종류에 대해서 한 가지가 빠진 느낌이 든다. 바로 void형이다.
그렇다면 void a;라고 쓰면 왜 컴파일 에러가 발생할까? 그 이유는 a한테 얼마만큼의 메모리를 할당해 줘야 하는지 알려주지 않았기 때문이다. 반면에 viod 포인터로 사용되는 것은(void* ptr=&a;) 문제가 없다. 왜냐하면 void 포인터형의 목적은 그저 "a의 type이 뭐든 간에 그저 주소만 저장하자"이기 때문이다. 그렇다면 void 포인터형은 어떻게 사용될까?
double a=3.141;
void* ptr=&a; // ptr가 어떤 type의 변수를 가리키고 있는지 언급하지 않음
printf("%lf", *(double *)ptr); // 참조할 때 어떤 type인지 알려줘야 함