자료형과 변수
I. 기본적인 자료형
자료형(Type)은 컴퓨터의 데이터 표현 방법이며 데이터를 저장하기 위한 가장 기본적인 수준의 규칙이다.
C언어에서 제공하는 기본적인 자료형은 크게 정수형과 실수형으로 나눌 수 있다.
부호 있는(singed) 정수형
| 크기(byte) | 표현 범위 | 용도 | |
|---|---|---|---|
| int | 4 | -2,147,483,648 ~ 2,147,483,647 | 일반적인 정수 표현 |
| short | 2 | -32,768 ~ 32,767 | 낮은 17px정수 표현 |
| char | 1 | -128 ~ 127 | 문자 표현 |
| long | 4 | -2,147,483,648 ~ 2,147,483,647 | 거의 안씀 |
| long long | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 큰 범위의 정수 표현 |
| bool | 1 | 0 또는1 | 참 또는 거짓 표현 |
부호 없는(unsigend) 정수형 정수로 음수를 표현할 일이 없을때는 unsigned int, unsigned long long와 같은 부호없는 정수형을 사용하여 양수 표현범위를 높이고 데이터를 절약할 수 있다. 표현 범위는 부호가 있을 때 가장 낮은 수(음수)의 절댓값의 두배이다.
실수형
| 크기(byte) | 표현 범위(대략) | 정밀도 | 용도 | |
|---|---|---|---|---|
| float | 4 | -3.4e38 ~ 3.4e38 | 6~7자리의 십진수 | 일반적인 실수(벡터, 좌표) |
| double | 8 | -1.7e308 ~ 1.7e308 | 15~16자리의 십진수 | 높은 정밀도의 실수(델타 타임) |
| long double | 8~16 | double보다 높은 범위 | double보다 높은 정밀도 | 매우 높은 정밀도의 실수(천문학, 금융시스템) |
공허형(void)
공허형은 말그대로 별다른 형식이 없는 자료형으로, 따라서 크기도 없다. 즉 할당 자체가 불가능한 자료형인데 함수의 선언에 사용되거나, 포인터 변수로 사용되기도 한다. 이때 void 포인터형은 8바이트의 크기를 가진다.
II. 변수
변수란 값을 저장하기 위해 메모리에 할당된 공간이다. 자료형과 함께 이름을 붙여 만드는 것을 '선언', 선언된 변수의 값을 읽거나 수정하는 것을 '접근'이라고 한다.
변수의 선언과 접근
변수를 선언할때는 그냥 선언하기도 하고, 대입 연산자로 값을 미리 초기화 해주기도 한다. 변수에 접근하여 값을 읽거나 수정할 수 있는데, 수정은 할 수 없는 읽기 전용 변수도 있다. const라는 키워드와 함께 선언된 상수이다.
읽기 전용 변수는 왜 사용할까? 프로그램 상 민감한 값이나 수정할 이유가 없는 값들에 대해서, 예기치 못한 접근으로 인한 오류를 사전에 예방할 수 있다는 장점이 있다. 또한 포인터 변수를 상수로 선언하면 메모리 주소 값이 변하지 않아 안전한 접근이 가능하다.
지역 변수(local variable)
'지역'은 특정한 코드블록을 위해 스택 영역에 할당된 메모리 공간을 의미하고, 이 공간에 선언된 변수를 '지역 변수'라고 한다. 여기서 스택 영역에 대한 개념은 다음 챕터에서 등장하지만, 현재는 '접근 가능성 여부'에 대해서만 간단하게 짚고 넘어가면 된다. 먼저 지역의 구분이 두 종류로 나뉜다는 설명이 필요하다.
- 블록 스코프: 에 의해 명시된 순차적인 코드 블록으로 지역이 구분된 경우
- 함수 스코프: 각각 독립적인 함수의 정의로 지역이 구분된 경우
블록 스코프의 예시
함수 스코프의 예시
위 두가지 모두 각각의 지역에 지역 변수가 선언된 예시이지만, 접근 가능성에서 차이가 있다. 블록 스코프의 경우, 자식 지역은 부모 지역에 접근이 가능하지만 그 반대는 불가능하다. 하지만 함수 스코프에서는 서로 다른 어느 지역에도 접근이 불가능하다. 컴파일러가 선언의 순서와 관계성을 파악하기 어렵기 때문이다.
전역 변수(global variable)
'전역 변수'란, 어느 지역에도 속해있지 않은, 달리 말하면 코드 상 가장 최상위 영역에 선언된 변수이다. 따라서 지역의 구분 없이 자유로운 접근이 가능하다.
전역 변수는 다른 소스 파일에서도 접근이 가능하다. 이를 위해선 extern 키워드를 사용하여 접근하고자 하는 파일에서 한번 더 선언해야 한다. 이것은 다른 소스 파일에 선언된 어떤 변수의 존재를 현재의 소스 파일에 미리 알려준다는 의미로 해석이 가능하다.
정적 변수(static variable)
static 키워드와 함께 선언된 변수를 정적 변수라고 하는데, '정적'의 의미는 이 변수가 할당된 공간이 프로그램의 시작부터 종료까지 유지된다는 의미다. 챕터 3에서 계속.