Skip to main content

변수, 자료형, 상수, 연산자

프로그래밍은 결국 데이터를 저장하고, 바꾸고, 계산하는 일입니다. 지금까지는 C 프로그램이 어떻게 생겼는지, main()이 무엇인지, printf()가 어떻게 동작하는지 살펴봤습니다. 이제부터는 그 프로그램 안에서 실제로 움직이는 재료들, 즉 값을 어떻게 다루는지 배웁니다.

변수는 값을 담는 상자이고, 자료형은 그 상자의 종류입니다. 상수는 한 번 정하면 바꾸지 않겠다고 약속한 값이고, 연산자는 그 값들을 더하고 비교하고 바꾸는 도구입니다. 이 장을 잘 이해하면 뒤에서 나오는 조건문, 반복문, 함수, 배열도 훨씬 편하게 배울 수 있습니다.

변수, 자료형, 상수, 연산자

변수란 무엇인가

변수는 값을 저장해 두는 이름 붙은 메모리 공간입니다. 쉽게 말해, 컴퓨터 메모리 속에 붙여 둔 라벨이라고 생각하면 됩니다.

예를 들어 사람의 나이, 시험 점수, 평균, 학점 같은 값을 프로그램에서 다루려면 어디엔가 저장해 두어야 합니다. 그때 쓰는 것이 변수입니다.

int age = 20;
int score = 95;

위 코드에서 age와 score는 변수 이름이고, int는 정수를 저장하겠다는 뜻입니다.

변수를 만들 때는 보통 다음 순서를 따릅니다.

자료형 변수이름 = 값;

예를 들면 이렇게 쓸 수 있습니다.

int year = 2026;
double weight = 68.5;
char grade = 'A';

여기서 눈여겨볼 점이 있습니다. grade에 들어간 'A'는 작은따옴표를 썼습니다. C에서 char는 문자 하나를 저장할 때 사용하며, 문자 하나는 작은따옴표로 감쌉니다.

변수는 선언만 하고 나중에 값을 넣을 수도 있습니다.

int count;
count = 10;

이때 초보자가 꼭 기억해야 할 습관이 있습니다. 가능하면 변수를 만들 때 바로 초기화하기입니다. 초기화하지 않은 지역 변수는 의미 없는 값이 들어 있을 수 있어서, 프로그램이 이상하게 동작할 수 있습니다.

변수 이름을 지을 때는 몇 가지 규칙이 있습니다.

  • 글자, 숫자, 밑줄 _을 사용할 수 있습니다.

  • 숫자로 시작할 수 없습니다.

  • int, for, while 같은 예약어는 이름으로 사용할 수 없습니다.

  • 대문자와 소문자는 서로 다르게 취급됩니다.

예를 들어 studentCount는 좋은 이름이고, 2score는 잘못된 이름입니다.

자료형: 어떤 종류의 값을 저장할까

변수는 아무 값이나 다 넣는 만능 상자가 아닙니다. 어떤 변수는 정수만, 어떤 변수는 실수만, 어떤 변수는 문자만 저장합니다. 이 구분이 바로 자료형(data type)입니다.

C는 자료형을 명확하게 적어 주는 언어입니다. 그래서 변수를 만들 때 "이 변수는 무슨 종류의 값을 저장할까?"를 먼저 정해야 합니다.

가장 자주 쓰는 기본 자료형

초보자가 가장 먼저 익혀야 할 자료형은 다음 정도입니다.

자료형의미예시자주 쓰는 출력 형식
int정수10, -3, 0%d
char문자 1개'A', 'z', '7'%c
float실수3.14f, 0.5f%f
double더 정밀한 실수3.141592, 12.75%f

입문 단계에서는 int, char, double만 잘 다뤄도 꽤 많은 문제를 풀 수 있습니다.

여기서 한 가지를 미리 정리해 두면 좋습니다. 출력할 때 printf()에서는 float와 double 모두 보통 %f를 사용합니다. 반면 입력할 때 scanf()에서는 float는 %f, double은 %lf를 사용합니다. 이 차이를 헷갈리는 초보자가 정말 많습니다.

정수 자료형

정수는 소수점이 없는 수입니다.

int apple = 7;
int temperature = -2;

정수 자료형에는 short, long, long long, unsigned int 같은 변형도 있습니다. 하지만 처음에는 int부터 익히는 것이 좋습니다.

다만 중요한 사실이 하나 있습니다. C에서 자료형의 정확한 크기는 컴파일러와 시스템에 따라 달라질 수 있습니다. 예를 들어 int는 최소 16비트이지만, 많은 현대 환경에서는 보통 4바이트입니다. char는 1바이트이며, long의 크기도 환경에 따라 다를 수 있습니다.1

즉, "int는 무조건 4바이트다"라고 외우기보다, "대개 그렇지만 환경에 따라 달라질 수 있다"라고 이해하는 편이 더 정확합니다.

실수 자료형

실수는 소수점이 있는 수입니다.

float height = 175.5f;
double pi = 3.141592;

float보다 double이 더 정밀합니다. 아주 단순한 계산은 float로도 되지만, 일반적으로는 double이 더 안정적입니다.

또 한 가지, float 상수는 뒤에 f를 붙이는 습관을 들이면 좋습니다.

float price = 9.99f;

9.99만 쓰면 기본적으로 double 상수로 해석되기 때문입니다.

문자 자료형

char는 문자 하나를 저장합니다.

char initial = 'C';
char grade = 'B';

여기서 재미있는 점이 있습니다. C에서 문자는 사실 작은 정수처럼도 다뤄집니다. 즉, 'A' 같은 문자는 내부적으로 문자 코드를 갖고 있어서 계산에 참여할 수 있습니다.

char ch = 'A';
printf("%cn", ch);
printf("%dn", ch);

첫 줄은 A를 출력하고, 둘째 줄은 그 문자에 해당하는 숫자 값을 출력합니다. 그래서 C에서는 문자와 정수가 생각보다 가까운 사이입니다.

signed와 unsigned

정수는 음수를 허용할 수도 있고, 0 이상의 값만 저장하게 만들 수도 있습니다.

int a = -10;
unsigned int b = 10;

unsigned는 음수를 저장하지 않는 대신, 같은 크기에서 더 큰 양수를 저장할 수 있습니다. 다만 초보자에게는 함정도 있습니다. signed와 unsigned를 섞어 계산하면 예상 밖의 결과가 나올 수 있으니, 처음에는 특별한 이유가 없으면 그냥 int를 사용하는 편이 안전합니다.2

bool은 어떤가요?

참과 거짓을 표현하는 값도 있습니다. 현대 C에서는 _Bool 또는 stdbool.h를 통해 bool을 사용할 수 있습니다. 다만 입문 단계에서는 조건식의 결과가 0 또는 1로 다뤄진다는 정도만 알고 있어도 충분합니다.1

sizeof로 크기 확인하기

자료형의 크기는 직접 확인할 수 있습니다. 이때 사용하는 것이 sizeof 연산자입니다.

#include <stdio.h>

int main(void) {
    printf("char: %zun", sizeof(char));
    printf("int: %zun", sizeof(int));
    printf("float: %zun", sizeof(float));
    printf("double: %zun", sizeof(double));
    return 0;
}

이 코드를 실행하면 여러분의 컴퓨터에서 각 자료형이 몇 바이트인지 확인할 수 있습니다. 교재의 표를 맹신하기보다, 이렇게 직접 확인하는 습관이 좋습니다.1

상수: 한 번 정하면 바꾸지 않는 값

상수는 이름 그대로 변하지 않는 값입니다.

예를 들어 원주율, 일주일의 날짜 수, 만점 기준 같은 값은 프로그램이 실행되는 동안 바뀌지 않는 경우가 많습니다. 이런 값을 상수로 표현하면 코드가 더 읽기 쉬워지고, 실수로 값을 바꾸는 일도 줄어듭니다.

리터럴 상수

코드에 직접 적은 값 자체를 리터럴이라고 합니다.

10
3.14
'A'

이 값들은 그대로 고정된 값입니다.

const를 사용하는 방법

가장 자연스러운 방법은 const를 쓰는 것입니다.

const int DAYS_IN_WEEK = 7;
const double PI = 3.141592;

이렇게 선언한 뒤에는 값을 바꾸지 않는 것이 원칙입니다.

const int MAX_SCORE = 100;
// MAX_SCORE = 200;   // 오류

초보자에게는 const가 특히 좋습니다. 자료형이 함께 적혀 있어서, "이 값은 정수 상수다", "이 값은 실수 상수다"를 한눈에 알 수 있기 때문입니다.

#define과의 차이

상수처럼 보이게 만드는 다른 방법도 있습니다.

#define TAX_RATE 0.1

이 방식은 전처리기 단계에서 문자 치환처럼 동작합니다. 나중에 전처리기를 배울 때 자세히 다루겠지만, 지금은 입문 단계에서는 const를 먼저 익히는 편이 이해하기 쉽다고 생각하면 됩니다.

연산자: 값을 움직이고 계산하는 도구

연산자는 값에 어떤 동작을 시키는 기호입니다. 더하기, 빼기, 비교하기, 참/거짓 판정하기 같은 일이 모두 연산자로 이루어집니다. C에는 여러 종류의 연산자가 있으며, 산술, 비교, 논리, 대입, 비트 연산 등으로 나눌 수 있습니다.4

산술 연산자

가장 익숙한 연산자입니다.

연산자의미예시
+덧셈a + b
-뺄셈a - b
*곱셈a * b
/나눗셈a / b
%나머지a % b

예를 들어,

int a = 10;
int b = 3;

printf("%dn", a + b);  // 13
printf("%dn", a - b);  // 7
printf("%dn", a * b);  // 30
printf("%dn", a / b);  // 3
printf("%dn", a % b);  // 1

여기서 초보자가 가장 많이 놀라는 부분은 a / b입니다. 10 / 3이면 3.333...을 기대하기 쉽지만, a와 b가 둘 다 int이므로 결과도 정수 계산이 되어 소수 부분이 버려집니다.3

즉,

int x = 5;
int y = 2;
printf("%dn", x / y);   // 2

이 결과는 2입니다. 틀린 것이 아니라, 정수 나눗셈이라서 그렇습니다.

증감 연산자

값을 1 증가시키거나 1 감소시키는 연산자입니다.

int n = 5;
n++;
++n;
n--;
--n;

n++와 ++n은 둘 다 결국 1 증가하지만, 표현식 안에서 사용될 때 동작 시점이 다릅니다. 지금 단계에서는 "둘 다 1 증가시킨다" 정도로 먼저 이해해도 충분합니다. 자세한 차이는 예제를 많이 다루면서 익히면 됩니다.

대입 연산자

대입 연산자는 오른쪽 값을 왼쪽 변수에 저장합니다.

int score = 90;

그리고 축약 형태도 자주 씁니다.

score += 5;   // score = score + 5;
score -= 3;   // score = score - 3;
score *= 2;   // score = score * 2;
score /= 4;   // score = score / 4;

코드가 짧아지고 읽기도 편해집니다.

비교 연산자

두 값을 비교해서 참이면 1, 거짓이면 0으로 판단합니다.

연산자의미
<작다
>크다
<=작거나 같다
>=크거나 같다
==같다
!=다르다

예를 들어,

int age = 20;
printf("%dn", age >= 18);   // 1
printf("%dn", age == 18);   // 0

여기서 아주 중요한 포인트가 있습니다.

=는 대입, ==는 비교입니다.

초보자가 가장 자주 하는 실수 중 하나가 이것입니다.

int x = 10;
if (x == 10) {
    printf("같다n");
}

비교할 때는 ==를 써야 합니다.

논리 연산자

조건을 여러 개 이어 붙일 때 사용합니다.

연산자의미
&&그리고(AND)
`
!아니다(NOT)

예를 들면,

int age = 20;
int hasTicket = 1;

printf("%dn", age >= 18 && hasTicket);  // 1
printf("%dn", age < 18 || hasTicket);   // 1
printf("%dn", !hasTicket);              // 0

이 연산자들은 다음 장에서 조건문을 배울 때 정말 자주 등장합니다. 지금은 "조건을 묶는 도구"라고 이해하면 좋습니다.

비트 연산자는 잠깐 맛보기만

C에는 &, |, ^, ~, <<, >> 같은 비트 연산자도 있습니다.4 이들은 숫자를 비트 단위로 다루는 도구라서 시스템 프로그래밍이나 임베디드에서 특히 중요합니다. 다만 처음부터 깊게 파고들면 머리가 복잡해질 수 있으니, 지금은 "이런 것도 있구나" 정도면 충분합니다.

형변환: 자료형이 바뀌면 결과도 바뀐다

형변환은 어떤 값을 다른 자료형으로 바꾸는 것입니다. 이 개념은 연산 결과를 이해할 때 아주 중요합니다.

형변환에는 두 가지가 있습니다.

자동 형변환(암시적 형변환)

컴파일러가 알아서 자료형을 바꾸는 경우입니다.

int a = 5;
double b = 2.5;
double result = a + b;

여기서는 a가 자동으로 double처럼 다뤄져서 결과도 double이 됩니다. 이런 식의 변환은 서로 다른 자료형이 함께 계산될 때 자주 일어납니다. 특히 char, short 같은 더 작은 정수형은 표현식 안에서 int로 승격되는 일이 많습니다.2

강제 형변환(명시적 형변환)

프로그래머가 직접 "이 자료형으로 바꿔라"라고 써 주는 경우입니다.

float result = (float)5 / 2;

이 코드는 5를 먼저 float로 바꾸고 나누기 때문에 결과가 2.5가 됩니다.3

조금 더 풀어 보면 이렇습니다.

int a = 5;
int b = 2;

printf("%dn", a / b);          // 2
printf("%.1fn", (float)a / b); // 2.5

이 차이는 정말 중요합니다. 계산이 왜 이상하게 나오는지 몰라서 한참 헤매는 초보자가 아주 많습니다.

형변환에서 생기는 정보 손실

큰 범위의 값을 작은 범위의 자료형으로 바꾸면 정보가 사라질 수 있습니다.

double x = 3.99;
int y = (int)x;
printf("%dn", y);   // 3

소수 부분이 사라졌습니다. 반올림이 아니라 잘림입니다.

마찬가지로 음수를 unsigned로 바꾸거나, 매우 큰 수를 작은 자료형에 넣으면 이상한 값처럼 보일 수 있습니다. 이건 컴퓨터가 고장 난 것이 아니라, 자료형의 범위와 표현 방식이 바뀌었기 때문입니다.

연산자 우선순위와 괄호

수학에서 곱셈이 덧셈보다 먼저 계산되듯, C 연산자에도 우선순위가 있습니다.

int result = 2 + 3 * 4;

이 결과는 20이 아니라 14입니다. 3 * 4가 먼저 계산되기 때문입니다.

헷갈릴 때는 괄호를 쓰는 것이 가장 좋습니다.

int result1 = 2 + 3 * 4;     // 14
int result2 = (2 + 3) * 4;   // 20

초보자일수록 "컴파일러가 알아서 이해하겠지"보다 "사람도 쉽게 읽게 쓰자"는 마음이 중요합니다. 괄호는 친절입니다.

실전 예제: 평균과 합격 여부 계산하기

이제 배운 내용을 한 번에 섞어 보겠습니다.

#include <stdio.h>

int main(void) {
    int korean = 87;
    int english = 92;
    int math = 78;

    const int PASS_SCORE = 80;

    int total = korean + english + math;
    double average = total / 3.0;
    int isPass = average >= PASS_SCORE;

    printf("총점: %dn", total);
    printf("평균: %.2fn", average);
    printf("합격 여부(1:합격, 0:불합격): %dn", isPass);

    return 0;
}

이 예제에는 지금까지 배운 핵심이 모두 들어 있습니다.

korean, english, math는 정수형 변수입니다. PASS_SCORE는 바뀌지 않는 상수입니다. total은 산술 연산자로 계산했고, average는 3.0을 사용해 실수 나눗셈이 되도록 만들었습니다. 마지막으로 average >= PASS_SCORE는 비교 연산의 결과이며, 참이면 1, 거짓이면 0이 됩니다.

만약 average = total / 3;라고 썼다면 어떤 일이 벌어질까요? 총점이 257일 때 평균은 85.666...이어야 하지만, 정수 나눗셈이 되어 85만 저장됩니다. 사소해 보여도 결과를 크게 바꿔 버릴 수 있는 차이입니다.

초보자가 자주 하는 실수

처음 배울 때는 누구나 비슷한 곳에서 미끄러집니다. 미리 알고 가면 훨씬 덜 아픕니다.

  • 초기화하지 않은 변수 사용하기: 변수 안에 무엇이 들어 있는지 모른 채 사용하면 결과가 이상해질 수 있습니다.

  • =와 ==를 헷갈리기: =는 저장, ==는 비교입니다.

  • 정수 나눗셈을 잊기: 5 / 2는 2.5가 아니라 2입니다.

  • char와 문자열을 혼동하기: char는 문자 하나입니다. 여러 글자는 나중에 문자열에서 배웁니다.

  • 실수의 정확도를 너무 믿기: float, double은 편리하지만 모든 소수를 완벽히 표현하지는 못합니다.

  • 출력과 입력의 서식 지정자를 섞어 기억하기: printf()와 scanf()는 같은 %f 계열이라도 쓰임이 조금 다릅니다.

  • signed와 unsigned를 섞어 쓰기: 예상하지 못한 큰 수가 튀어나올 수 있습니다.

정리

이번 장에서 꼭 붙잡아야 할 핵심은 단순합니다.

변수는 값을 저장하는 이름 있는 공간입니다. 자료형은 그 공간에 어떤 종류의 값을 저장할지 정합니다. 상수는 바뀌지 않는 값을 더 안전하고 읽기 쉽게 표현합니다. 연산자는 그 값들을 계산하고 비교하고 바꾸는 도구입니다. 그리고 형변환은 계산 결과를 크게 바꿀 수 있으므로, 특히 정수 나눗셈과 실수 계산에서 항상 신경 써야 합니다.

이제 여러분은 C 프로그램이 단순히 문장을 나열한 것이 아니라, 데이터를 담고 움직이고 판단하는 구조라는 사실을 보기 시작했습니다. 다음 장에서는 이 값들을 가지고 프로그램의 흐름을 바꾸는 방법, 즉 조건문과 반복문을 배우게 됩니다. 이제 코드가 조금씩 살아 움직이기 시작할 차례입니다.

참고

1C data types - Wikipedia

2Type conversions (C) | Microsoft Learn

3C Type Conversion

4Operators in C - GeeksforGeeks

책 목록

초보자를 위한 C 언어 학습: 기초부터 프로젝트까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기