[C 시리즈 3편] 변수와 기본 자료형으로 값 다루기

English version

2편에서 Mac에서 C 코드를 컴파일하고 실행하는 흐름을 확인했습니다. 이제는 실행되는 코드 안에서 값을 어떻게 저장하고 다루는지 볼 차례입니다. C에서는 변수 이름만 정하는 것이 아니라, 그 값이 어떤 자료형인지 먼저 선언해야 합니다. 그 이유는 컴파일러가 몇 바이트를 준비하고, 그 바이트를 어떤 규칙으로 읽을지 미리 알아야 하기 때문입니다.

이번 글에서 새로 나오는 용어

  1. 자료형 (Type): 값의 종류에 따라 몇 바이트를 쓰고 어떻게 해석할지 정하는 규칙
  2. 초기화 (Initialization): 변수를 선언할 때 처음 값을 넣어 두는 것
  3. 서식 지정자 (Format Specifier): printf에서 값의 자료형에 맞춰 출력 형식을 알려 주는 기호
  4. 바이트 (Byte): 메모리 크기를 세는 기본 단위

핵심 개념

학습 메모

  • 소요 시간: 40~50분
  • 준비물: clang hello.c -o hello 흐름을 따라 해 본 경험
  • 학습 목표: 변수 선언, 기본 자료형, sizeof, 출력 형식 연결하기

변수는 값을 담는 이름표이고, 자료형은 그 값에 몇 바이트를 쓰고 그 바이트를 어떤 값으로 읽을지 정하는 규칙입니다. C에서는 이 규칙을 먼저 적어야 하므로, 변수와 자료형을 따로 떼지 말고 함께 익히는 것이 좋습니다.

이번 글에서는 아래 네 가지를 중심으로 봅니다.

  • 값을 저장하려면 왜 자료형을 먼저 적어야 하는가
  • int, char, float, double이 각각 어떤 값을 다루는가
  • sizeof로 자료형 크기를 어떻게 확인하는가
  • printf에서 자료형에 맞는 출력 형식을 어떻게 쓰는가

코드로 따라하기

변수 선언과 초기화

C에서는 변수를 만들 때 보통 자료형을 먼저 쓰고, 그다음 변수 이름을 적습니다.

#include <stdio.h>

int main(void) {
    int age = 17;
    float height = 172.4f;
    char grade = 'A';

    printf("age = %d\n", age);
    printf("height = %.1f\n", height);
    printf("grade = %c\n", grade);
    return 0;
}

여기서 int, float, char가 자료형입니다. age = 17, height = 172.4f, grade = 'A'처럼 처음 값을 넣는 과정을 초기화라고 합니다.

같은 문장에서 "어떤 값을 저장할지"와 "그 값이 어떤 종류인지"를 함께 적는 이유는, 컴파일러가 이 정보를 바탕으로 메모리를 준비하기 때문입니다.

쉽게 말해, 자료형은 메모리 칸 사용 계획표에 가깝습니다. 예를 들어 char는 보통 1칸(1바이트), int는 보통 4칸을 사용합니다. 자료형이 없으면 컴파일러는 "이 값을 위해 몇 칸을 준비해야 하지?"를 결정할 수 없습니다.

가장 자주 쓰는 기본 자료형

  • int: 정수 저장
  • char: 문자 하나 저장
  • float: 실수 저장
  • double: 더 정밀한 실수 저장

아래 코드는 같은 프로그램 안에서 네 가지 자료형을 함께 출력합니다.

#include <stdio.h>

int main(void) {
    int student_count = 28;
    char section = 'B';
    float temperature = 23.5f;
    double average_score = 91.78;

    printf("students = %d\n", student_count);
    printf("section = %c\n", section);
    printf("temperature = %.1f\n", temperature);
    printf("average = %.2f\n", average_score);
    return 0;
}

입문 단계에서는 "정수는 int, 문자 하나는 char, 소수점이 있으면 float 또는 double" 정도로 먼저 기억하면 충분합니다. 보통 doublefloat보다 더 많은 자릿수를 더 정확하게 다룰 수 있다는 점만 함께 알아 두세요.

메모리 크기 확인하기: sizeof

C의 중요한 특징은 자료형이 메모리 크기와 연결된다는 점입니다. sizeof를 사용하면 특정 자료형이나 변수의 크기를 바이트 단위로 확인할 수 있습니다.

#include <stdio.h>

int main(void) {
    printf("sizeof(char) = %zu\n", sizeof(char));
    printf("sizeof(int) = %zu\n", sizeof(int));
    printf("sizeof(float) = %zu\n", sizeof(float));
    printf("sizeof(double) = %zu\n", sizeof(double));
    return 0;
}

대부분의 Mac 64비트 환경에서는 char = 1, int = 4, float = 4, double = 8이 나옵니다. 다만 char가 1바이트라는 점 외에는 시스템에 따라 달라질 수 있으므로, 실제 프로그램에서는 직접 확인하는 습관이 중요합니다.

%zusizeof 결과를 출력할 때 자주 쓰는 서식 지정자입니다. 지금은 "크기를 출력할 때 쓰는 형식" 정도로 기억해도 충분합니다.

출력 형식 맞추기: printf

printf는 값만 넣는다고 끝나지 않습니다. 값의 자료형에 맞는 서식 지정자를 함께 써야 합니다. 서식 지정자는 메모리에 들어 있는 값을 정수처럼 읽을지, 문자처럼 읽을지, 실수처럼 읽을지 알려 주는 표시라고 생각하면 이해하기 쉽습니다.

#include <stdio.h>

int main(void) {
    int year = 2026;
    char level = 'A';
    float rate = 4.5f;

    printf("year = %d\n", year);
    printf("level = %c\n", level);
    printf("rate = %.1f\n", rate);
    return 0;
}

가장 먼저 익힐 조합은 아래 세 가지입니다.

  • %d: int 출력
  • %c: char 출력
  • %f: float, double 출력

실수는 %.1f, %.2f처럼 소수점 아래 몇 자리까지 보여 줄지 지정할 수도 있습니다.

자료형과 서식 지정자가 맞지 않으면 컴파일 경고가 나오거나, 실행은 되더라도 결과가 이상하게 보일 수 있습니다. 그래서 C에서는 값의 종류와 출력 형식을 항상 함께 확인하는 습관이 중요합니다.

값을 바꾸고 다시 출력하기

변수는 한 번 만들고 끝나는 것이 아니라, 새 값을 다시 넣을 수도 있습니다.

#include <stdio.h>

int main(void) {
    int score = 80;

    printf("before = %d\n", score);
    score = 95;
    printf("after = %d\n", score);
    return 0;
}

이때 score라는 이름은 그대로지만, 메모리에 저장된 값은 바뀝니다. 이후 조건문과 반복문을 배울 때는 이런 값 변화가 프로그램 흐름을 바꾸는 기준이 됩니다.

실전 예시: 시험 결과 요약하기

아래 예제는 학생 한 명의 기본 정보를 변수로 저장하고 요약 문장을 출력합니다.

#include <stdio.h>

int main(void) {
    int score = 88;
    double attendance_rate = 96.5;
    char passed = 'Y';

    printf("score = %d\n", score);
    printf("attendance = %.1f%%\n", attendance_rate);
    printf("passed = %c\n", passed);
    return 0;
}

여기서 %%는 퍼센트 기호 자체를 출력하기 위한 표기입니다. 이런 작은 규칙이 처음에는 자주 헷갈리지만, 직접 여러 번 찍어 보면 금방 익숙해집니다.

왜 중요한가

변수와 자료형 감각이 잡혀야 다음 편의 조건문과 반복문도 자연스럽게 이해할 수 있습니다. 조건문은 "현재 값이 어떤 상태인가"를 보고 갈림길을 만들고, 반복문은 "값이 어떻게 바뀌는가"를 이용해 같은 작업을 여러 번 수행하기 때문입니다.

이번 글에서 꼭 남겨야 할 핵심은 네 가지입니다.

  • C에서는 변수를 만들 때 자료형을 먼저 선언한다.
  • 자료형은 값의 종류뿐 아니라 메모리 해석 방식과도 연결된다.
  • sizeof로 자료형 크기를 직접 확인할 수 있다.
  • printf는 자료형에 맞는 서식 지정자를 써야 한다.

이 네 가지가 익숙해지면, 이후에 배열과 포인터를 볼 때도 "왜 크기와 형식이 중요한가"를 더 쉽게 받아들일 수 있습니다.

CodeSandbox로 이어서 실습하기

아래 샌드박스는 CodeSandbox의 Universal starter입니다. C는 터미널에서 직접 컴파일하고 다시 실행하는 흐름이 중요하니, 이번 글의 코드를 파일로 만들고 빌드-실행 사이클을 다시 따라가 보세요.

Live Practice

C Practice Sandbox

CodeSandbox

Run the starter project in CodeSandbox, compare it with the lesson code, and keep experimenting.

Universal starterCterminal
  1. starter를 fork한 뒤 hello.c 같은 실습 파일을 만든다
  2. 본문 코드를 붙여 넣고 clang 또는 gcc가 있으면 직접 컴파일한다
  3. 코드를 고친 뒤 다시 빌드하고 실행 결과를 비교한다

C는 브라우저 미리보기보다 터미널 빌드 흐름이 핵심입니다. Universal starter의 컴파일러 구성이 환경에 따라 다를 수 있으니, 먼저 clang이나 gcc 사용 가능 여부부터 확인하세요.

실습

  • 따라 하기: 본문 예제를 하나씩 실행하면서 int, char, float, double 값을 각각 출력해 봅니다.
  • 확장하기: name 대신 이니셜 문자 하나와 나이, 평균 점수를 조합해 자기소개 출력 프로그램을 만듭니다.
  • 디버깅: printf("%d\n", 3.14);처럼 자료형과 서식 지정자를 일부러 맞지 않게 써 보고, 컴파일 경고가 생기는지와 출력이 왜 믿기 어려운지 관찰합니다.
  • 완료 기준: int, char, float, double의 역할을 설명하고, sizeofprintf를 사용해 값을 직접 출력할 수 있으면 됩니다.

마무리

이번 글에서는 C에서 값을 다루는 가장 기본 단위인 변수와 자료형을 살펴봤습니다. 중요한 것은 문법을 외우는 것보다, "값의 종류에 따라 저장 방식과 출력 방식이 달라진다"는 감각을 잡는 것입니다. 다음 글에서는 이 값을 기준으로 프로그램 흐름을 바꾸는 조건문과 반복문을 살펴보겠습니다.

💬 댓글

이 글에 대한 의견을 남겨주세요