자료형
C 언어에서 자료형은 데이터의 종류를 의미한다. 변수나 상수 등의 데이터는 이 자료형에 따라 정의되기 때문에, 자료형의 성질을 이해해야 각 변수나 상수의 특성을 정확히 파악하고 적절한 자료형을 사용할 수 있다.
자료형은 크게 기본 자료형과 사용자 정의 자료형으로 나뉜다. 기본 자료형은 다시 정수형, 부동소수점형(실수형), 문자형으로 나뉘고, 사용자 정의 자료형은 구조체, 공용체, 열거형으로 나뉜다.
사용자 정의 자료형은 기본 자료형을 기반으로 만들어지기 때문에, 기본 자료형에 대한 이해가 있어야 사용자 정의 자료형도 효과적으로 다룰 수 있다. 예를 들어, 구조체는 여러 가지 자료형을 하나로 묶은 자료형인데 이때 구조체 내부에서 사용되는 자료형들은 기본 자료형이다. 물론 구조체나 공용체 내부에 다른 구조체나 공용체를 포함할 수 있지만, 이러한 내부 구조체나 공용체들은 결국 기본 자료형들로 구성된다.
자료형의 성질을 이해해야 하는 중요한 이유 중 하나는 자료형이 표현할 수 있는 데이터의 범위를 정확히 파악할 수 있기 때문이다. 컴퓨터의 메모리는 한정되어 있기 때문에, 데이터를 저장할 때 무한히 큰 메모리 공간을 사용할 수 없다. 따라서 C 언어에서는 자료형을 통해 데이터의 크기를 제한하여 메모리를 효율적으로 관리한다. C 언어에서는 각 자료형이 고정된 크기를 가지며, 이 크기는 컴파일 시에 결정된다. 예를 들어, int 형은 보통 4 byte 를 차지하며, 이 크기는 변하지 않는다. 참고로, 파이썬과 같은 언어는 데이터의 크기에 따라 메모리를 동적으로 할당하는 방식을 사용하여 미리 자료형의 크기를 고정하지 않기도 한다.
데이터의 크기를 제한한다는 것은 그 크기를 초과하는 데이터는 저장할 수 없다는 의미이다. 예를 들어, int 형은 4 byte 의 메모리 공간을 사용하는데, 이 공간에서는 양수만 표현할 경우 0부터 4,294,967,295까지 표현할 수 있다. 따라서 int 형으로 정의된 변수에는 4,294,967,295를 초과하는 수는 저장할 수 없다. 이는 마치 4자리의 10진수로는 9,999까지만 표현할 수 있는 것과 같은 원리로 각 비트(1 byte = 8 bit)가 2진수의 자리라고 생각하면 된다.
기본 자료형의 크기와 범위
자료형 | 크기와 범위 | |
문자형 | char | 1 byte -128 ~ 127 |
unsigned char | 1 byte 0 ~ 255 |
|
정수형 | short | 2 byte -32,768 ~ 32,767 |
unsigned short | 2 byte 0 ~ 65,535 |
|
int | 4 byte -2,147,483,648 ~ 2,147,483,647 |
|
unsigned int | 4 byte 0 ~ 4,294,967,295 |
|
long | 4 byte -2,147,483,648 ~ 2,147,483,647 |
|
unsigned long | 4 byte 0 ~ 4,294,967,295 |
|
long long | 8 byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
|
unsigned long long | 8 byte 0 ~ 18,446,744,073,709,551,615 |
|
부동소수점형 (실수형) |
float | 4 byte 약 ±1.2E-38 ~ ±3.4E+38 (7자리 정밀도) |
double | 8 byte 약 ±2.3E-308 ~ ±1.7E+308 (15자리 정밀도) |
|
long double | 8 byte 이상 double보다 넓은 범위, 더 높은 정밀도 |
기본적으로 기본 자료형은 signed 즉 부호가 표현되어 있지만, 앞에 unsigned 를 붙여 양수 영역만 사용할 수도 있다.
주의해야 할 점은 기본 자료형의 크기와 범위는 운영체제, 컴파일러 등에 따라 조금씩 다를 수 있다. 예를 들어 long 의 경우 64 bit 리눅스에서는 8 byte 를 사용하지만, 윈도우에서는 4 byte 를 사용한다. 위 크기와 범위 는 윈도우 기준이다. 이를 확인하기 위해서는 sizeof 연산자를 활용하면 된다.
sizeof() 는 괄호 속 자료형의 크기를 byte 기준으로 반환한다. 따라서 미리 sizeof 연산자를 통해 새로운 환경에서 자료형의 크기를 확인해볼 수 있다.
'Language > C & C++' 카테고리의 다른 글
[C++] 값에 의한 호출(call by value)과 주소에 의한 호출(call by address) 그리고 참조에 의한 호출(call by reference) (0) | 2024.10.13 |
---|---|
[C++] 동적 메모리 할당 및 반환 (0) | 2024.10.13 |
[C++] 클래스(class)와 객체(object) 선언 (0) | 2024.09.18 |
[C] 입출력 형식과 서식 지정자 (0) | 2024.08.30 |
[C] 연산자 우선순위 (0) | 2024.08.30 |