C언어 변수와 데이터 타입 완벽 정리
C언어를 배우는 모든 사람이 가장 먼저 마주치는 두 개념이 바로 변수(Variable)와 데이터 타입(Data Type)이다. 이 두 개념을 정확히 이해하지 못하면 그 어떤 복잡한 알고리즘도 올바르게 구현할 수 없으며, 메모리 관리·포인터·구조체 같은 후속 개념도 무너진 토대 위에 쌓이는 셈이 된다. C언어가 자료형에 매우 엄격한 정적 타입 언어인 만큼, 변수의 선언 방식과 자료형의 크기·범위를 명확히 알고 있어야 안정적인 프로그램을 작성할 수 있다. 본 글은 C언어 입문자가 반드시 갖춰야 할 변수의 개념과 명명 규칙, 기본 데이터 타입의 크기와 범위, 그리고 타입 변환과 저장 클래스를 한 번에 정리한다.

변수의 개념과 명명 규칙
변수란 데이터를 저장하기 위한 메모리 공간에 이름을 붙인 것을 의미한다. 컴퓨터의 메모리는 본질적으로 0과 1의 비트 배열이지만, 프로그램이 매번 비트 단위로 데이터를 다루는 것은 사실상 불가능하기 때문에 일정한 크기의 메모리 영역에 의미 있는 이름을 부여하고 그 이름으로 데이터에 접근하는 방식을 사용한다. C언어에서 변수를 만드는 작업은 두 단계로 이루어진다. 첫째는 선언(Declaration)으로, "자료형 변수명;" 형식으로 작성해 컴파일러에게 어떤 종류의 데이터가 어떤 이름의 메모리 공간에 저장될 것인지를 알려준다. 둘째는 초기화(Initialization)로, "자료형 변수명 = 초기값;" 형식으로 변수를 만들면서 동시에 값을 할당한다. 초기화하지 않은 지역 변수는 쓰레기 값(Garbage Value)을 가지므로, 사용 전에 반드시 의미 있는 값으로 초기화하는 것이 안전한 코딩의 첫 번째 원칙이다.
변수 이름을 정할 때는 C언어의 식별자(Identifier) 명명 규칙을 반드시 지켜야 한다. 첫째, 영문 알파벳, 숫자, 언더스코어(_)만 사용할 수 있다. 둘째, 이름의 첫 글자는 영문 알파벳 또는 언더스코어여야 하며, 숫자로 시작할 수 없다. 셋째, 대소문자를 구분하므로 age와 Age는 서로 다른 변수로 인식된다. 넷째, int·return·while 같은 C언어의 예약어(Keyword)는 변수 이름으로 사용할 수 없다. 다섯째, 이름의 길이에는 컴파일러별로 차이가 있지만, 일반적으로 31자 이내로 짓는 것이 안전하다.
변수 명명에서 규칙을 지키는 것 못지않게 중요한 것이 가독성을 높이는 작명 관습이다. 한 글자짜리 이름인 i·j·k는 반복문 카운터 같은 짧은 범위에서만 사용하고, 그 외에는 변수가 무엇을 담고 있는지 한눈에 알 수 있는 이름을 사용해야 한다. 예를 들어 학생의 점수를 담는 변수는 a보다 score 또는 student_score로 짓는 것이 훨씬 좋은 코드이다. 명명 스타일은 크게 세 가지가 있는데, 단어를 언더스코어로 잇는 스네이크 케이스(snake_case), 첫 단어 외에는 대문자로 시작하는 카멜 케이스(camelCase), 모든 단어를 대문자로 시작하는 파스칼 케이스(PascalCase)이다. C언어 진영에서는 전통적으로 스네이크 케이스가 가장 널리 사용되며, 한 프로젝트 안에서는 일관된 스타일을 유지하는 것이 중요하다.
C언어 기본 데이터 타입과 크기
C언어의 기본 데이터 타입은 표현하려는 값의 종류에 따라 정수형, 실수형, 문자형으로 분류된다. 각 타입은 메모리에서 차지하는 크기가 다르며, 따라서 표현할 수 있는 값의 범위도 달라진다. 시험과 실무 모두에서 자주 묻는 영역이므로 각 타입의 크기와 범위를 정확히 외워두어야 한다. 다만 자료형의 크기는 운영체제와 컴파일러에 따라 미묘하게 다를 수 있기 때문에, 정확한 크기는 sizeof 연산자를 사용해 확인하는 습관을 들여야 한다.
정수형은 소수점이 없는 수를 표현하는 자료형으로, 다섯 가지 기본 타입이 존재한다. char는 1바이트(8비트)로 -128부터 127까지 표현하며 사실상 가장 작은 정수형으로 활용된다. short는 2바이트로 약 -32,768부터 32,767까지 표현한다. int는 4바이트로 약 -21억부터 +21억까지 표현하며, 가장 보편적으로 사용되는 정수형이다. long은 운영체제에 따라 4바이트(Windows) 또는 8바이트(Linux 64비트)이며, long long은 모든 환경에서 8바이트로 약 ±9.2×10의 18제곱까지 표현할 수 있다. 정수형 앞에 unsigned 키워드를 붙이면 음수를 표현하지 않는 대신 양수 범위가 두 배로 확장되며, signed는 부호를 명시하는 키워드로 생략할 수 있다.
실수형은 소수점이 있는 수를 표현하는 자료형으로, IEEE 754 부동소수점 표준에 따라 부호·지수·가수 세 부분으로 비트가 나뉜다. float는 4바이트의 단정밀도(Single-Precision) 자료형으로 유효 자릿수 약 7자리를 보장한다. double은 8바이트의 배정밀도(Double-Precision) 자료형으로 유효 자릿수 약 15자리를 보장하며, C언어 실수 연산의 기본형이다. long double은 환경에 따라 8바이트 또는 16바이트로 더 높은 정밀도를 제공한다. 부동소수점은 본질적으로 근사값이기 때문에 0.1 + 0.2가 정확히 0.3이 되지 않는다는 점을 항상 기억해야 한다.
문자형은 단일 문자를 표현하는 자료형으로 char가 사용되지만, 내부적으로는 ASCII 코드값을 저장하는 1바이트 정수형이라는 사실에 유의해야 한다. 'A'는 65, 'a'는 97, '0'은 48 같은 정수로 저장되며, 따라서 'A' + 1을 계산하면 'B'에 해당하는 66이 된다. 문자열은 char 자료형의 배열로 표현하며, 끝을 알리는 NULL 문자(\0)로 종료된다. 그 밖에 C99 표준에서 추가된 _Bool 타입과 stdbool.h 헤더에 정의된 bool 타입이 참(true=1)과 거짓(false=0)을 표현하는 부울 자료형으로 사용된다. void 타입은 값이 없음을 명시하는 특수 타입으로, 함수의 반환값이 없거나 매개변수가 없을 때 사용된다.
타입 변환과 저장 클래스
서로 다른 데이터 타입의 값이 함께 사용될 때는 자동 또는 수동으로 타입 변환(Type Casting)이 일어난다. 타입 변환은 두 가지 방식으로 구분된다. 자동 형변환(Implicit Casting)은 컴파일러가 알아서 처리하는 변환으로, 일반적으로 데이터 손실이 없는 방향으로 진행된다. 작은 크기의 정수형이 큰 크기의 정수형으로 변환되거나, 정수형이 실수형으로 변환되는 경우가 대표적이다. 예를 들어 int에 float를 더하면 int가 자동으로 float로 변환되어 연산이 수행된다. 강제 형변환(Explicit Casting)은 프로그래머가 직접 명시하는 변환으로, "(자료형)값" 형식으로 작성한다. (int)3.14는 3.14를 int로 강제 변환해 3을 만들고, 이 과정에서 소수점 이하 부분이 잘려나간다. 강제 형변환은 데이터 손실 가능성이 있으므로 의도가 명확할 때만 사용해야 한다.
변수의 또 다른 중요한 속성은 저장 클래스(Storage Class)이다. 저장 클래스는 변수가 어디에 저장되고 얼마 동안 유지되며 어디서 접근 가능한지를 결정하는 속성으로, C언어에는 네 가지 저장 클래스 키워드가 존재한다. 첫째, auto는 지역 변수의 기본 저장 클래스로, 함수가 호출될 때 스택에 자동으로 생성되었다가 함수가 종료되면 자동으로 소멸한다. 키워드를 생략하면 자동으로 auto가 적용되기 때문에 실제로 명시하는 경우는 거의 없다.
둘째, static은 정적 변수를 선언하는 키워드로, 프로그램이 시작될 때 데이터 영역에 생성되어 프로그램 종료 시까지 유지된다. 함수 내부에서 static으로 선언된 지역 변수는 함수 호출이 끝나도 값이 유지되며, 다음 호출 때도 그 값을 그대로 사용할 수 있다는 특징이 있다. 또한 함수 호출 횟수를 누적하거나 캐시 값을 보관할 때 유용하게 활용된다. 전역 변수에 static을 붙이면 해당 변수의 사용 범위가 그 파일 내부로 제한되어, 다른 파일에서 접근할 수 없게 된다.
셋째, extern은 외부 변수를 참조하는 키워드로, 다른 소스 파일에 정의된 전역 변수를 현재 파일에서 사용할 때 활용된다. 큰 프로젝트에서 여러 파일이 협력해야 할 때 데이터 공유의 표준 방식으로 사용되며, 헤더 파일에 extern으로 변수를 선언하고 한 소스 파일에서 실제 정의를 두는 패턴이 일반적이다. 넷째, register는 CPU 레지스터에 변수를 저장하도록 권장하는 키워드로, 자주 접근하는 변수에 적용해 성능을 높이려는 목적으로 만들어졌다. 다만 현대의 최적화 컴파일러는 사용자보다 더 똑똑하게 레지스터를 활용하기 때문에, register 키워드는 사실상 무시되며 거의 사용되지 않는다. 결국 변수는 단순히 값을 담는 그릇이 아니라, 자료형·크기·저장 위치·생존 기간이 결합된 복합적 개념이며, C언어의 모든 기능은 이러한 변수의 정확한 이해 위에서 비로소 자유자재로 활용될 수 있다.
메타 디스크립션: C언어 입문자가 반드시 알아야 할 변수의 개념과 명명 규칙, 기본 데이터 타입(정수형·실수형·문자형)의 크기와 범위, 그리고 자동·강제 타입 변환과 4가지 저장 클래스(auto·static·extern·register)를 한 번에 정리합니다.