C 언어 데이터 타입

2025. 1. 21. 15:55프로그래밍 언어/C

C 언어의 데이터 타입은 크게 기본 데이터 타입(Primitive Types)과 확장/파생 데이터 타입으로 나뉩니다. 이 중 핵심 기본 타입으로 다음 4가지를 꼽을 수 있습니다:


핵심 기본 타입 (Core Primitive Types)

C 언어에서 가장 기본적이고 중요한 데이터 타입입니다:

  1. char: 문자와 작은 정수 표현 (1 byte)
    • 컴파일러에 따라 signed 또는 unsigned가 기본값으로 설정됩니다. 이를 명시적으로 선언하는 것이 좋습니다.
  2. int: 일반적인 정수 표현 (4 bytes)
  3. float: 단정밀도 실수 표현 (4 bytes)
  4. double: 배정밀도 실수 표현 (8 bytes)

이 4가지만으로 대부분의 프로그램을 작성할 수 있으며, 나머지 타입은 특정 용도나 상황에서 사용됩니다.


1. 기본 데이터 타입 (Primitive Data Types)

C 언어에서 제공하는 가장 기본적인 데이터 타입입니다.

1.1. 정수형 (Integer Types)

정수를 저장하기 위한 타입입니다. 데이터 타입의 크기와 범위는 플랫폼과 컴파일러에 따라 달라질 수 있습니다. 현재는 64비트 시스템이 널리 사용되므로 이에 대한 참고 정보를 추가로 제공합니다.

타입 크기 (32비트 시스템 기준) 크기 (64비트 시스템 기준) 범위 설명
char 1 byte 1 byte -128 ~ 127 (signed) 또는 0 ~ 255 (unsigned) 문자 저장 또는 작은 정수형
unsigned char 1 byte 1 byte 0 ~ 255 음수가 없는 문자형
short 2 bytes 2 bytes -32,768 ~ 32,767 작은 정수 저장
unsigned short 2 bytes 2 bytes 0 ~ 65,535 음수가 없는 작은 정수형
int 4 bytes 4 bytes -2,147,483,648 ~ 2,147,483,647 기본 정수형
unsigned int 4 bytes 4 bytes 0 ~ 4,294,967,295 음수가 없는 정수형
long 4 bytes (32비트 시스템) 8 bytes (64비트 시스템) 또는 일부 플랫폼에서 4 bytes -2,147,483,648 ~ 2,147,483,647 (32비트) 또는 플랫폼 의존 (64비트) 긴 정수형
unsigned long 4 bytes 8 bytes 또는 일부 플랫폼에서 4 bytes 0 ~ 4,294,967,295 (32비트) 또는 플랫폼 의존 (64비트) 음수가 없는 긴 정수형
long long 8 bytes 8 bytes -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 매우 긴 정수형
unsigned long long 8 bytes 8 bytes 0 ~ 18,446,744,073,709,551,615 음수가 없는 매우 긴 정수형

참고: long과 long double의 크기와 범위는 플랫폼과 컴파일러에 따라 다를 수 있습니다. 예를 들어, 64비트 Linux 시스템에서는 long이 8 bytes인 경우가 많지만, 일부 64비트 Windows 환경에서는 여전히 4 bytes로 유지됩니다.

1.2. 부동소수점형 (Floating-Point Types)

실수값을 저장하기 위한 타입입니다.

타입 크기 (32비트 시스템 기준) 크기 (64비트 시스템 기준) 정밀도 (소수점 자리) 설명
float 4 bytes 4 bytes 약 6~7자리 단정밀도 실수형, 32비트 IEEE 754 표준을 따름
double 8 bytes 8 bytes 약 15~16자리 배정밀도 실수형, 64비트 IEEE 754 표준을 따름
long double 16 bytes 플랫폼에 따라 다르며, 일부 시스템에서는 10 bytes 또는 16 bytes 플랫폼 의존 확장 정밀도 실수형

1.3. 기타 타입 (Other Types)

타입 설명
void 반환 값이 없음을 의미하는 타입
_Bool true(1) 또는 false(0)을 저장하는 논리형 (C99 표준)
bool <stdbool.h> 헤더 파일을 포함하여 사용할 수 있는 논리형
size_t 메모리 크기를 표현하기 위한 정수형 (unsigned)
ptrdiff_t 두 포인터의 차이를 나타내는 정수형
intptr_t 포인터를 정수로 저장할 때 사용하는 정수형

2. 파생 데이터 타입 (Derived Data Types)

기본 타입을 기반으로 새로 정의되는 타입입니다.

타입 설명
배열 (Array) 동일 타입 데이터를 연속으로 저장
포인터 (Pointer) 주소값을 저장하는 타입
구조체 (Struct) 서로 다른 타입을 묶는 사용자 정의 타입
공용체 (Union) 하나의 메모리 공간을 공유하는 타입. 가장 큰 멤버의 크기만큼 메모리를 할당하며, 한 번에 하나의 멤버만 저장 가능
열거형 (Enum) 상수값의 집합을 정의하는 타입
함수 (Function) 함수의 반환 타입과 매개변수 타입

3. 사용자 정의 데이터 타입 (User-Defined Data Types)

사용자가 새롭게 정의할 수 있는 타입입니다.

3.1. typedef

기존의 타입에 새 이름을 부여합니다.

typedef unsigned int uint;
uint a = 10; // unsigned int와 동일

3.2. enum

열거형 상수를 정의합니다.

enum Color { RED, GREEN, BLUE };
enum Color myColor = RED;

3.3. struct

구조체를 정의합니다.

struct Point {
    int x;
    int y;
};
struct Point p1 = {10, 20};

3.4. union

공용체를 정의합니다. 공용체는 모든 멤버가 동일한 메모리 공간을 공유하며, 한 번에 하나의 멤버만 활성화됩니다.

union Data {
    int i;
    float f;
};
union Data d;
d.i = 10;

4. 타입 한정자 (Type Qualifiers)

변수의 속성을 제한하거나 확장할 때 사용합니다.

한정자 설명
const 값을 변경할 수 없음을 나타냄
volatile 최적화를 방지하여 항상 메모리를 읽도록 강제
restrict 포인터 접근 최적화를 돕기 위한 제한
_Atomic 원자적 연산을 지원 (C11 표준 도입)

왜 핵심 타입이 4개로 요약될까?

C 언어의 다양한 데이터 타입 중에서 char, int, float, double만을 핵심으로 간주하는 이유는 다음과 같습니다:

  1. 단순성: 이 4개는 가장 기본적이고 자주 사용되며, 다른 모든 타입의 기반이 됩니다.
  2. 확장형 제외: short, long, unsigned 등은 기본 타입의 확장형으로 간주되며, 핵심적인 역할보다는 특수한 상황에서 사용됩니다.
  3. 특수 타입 제외: void와 같은 타입은 데이터를 저장하지 않으므로, 기본 타입의 정의에서 제외됩니다.