[C 시리즈 1편] 왜 지금 C를 공부할까

English version

C는 오래된 언어이지만, 여전히 컴퓨터가 어떻게 동작하는지 가장 직접적으로 보여 주는 언어입니다. 이번 글에서는 왜 Coding 카테고리의 다음 언어로 C를 선택했는지, 그리고 어떤 순서로 공부하면 좋은지 정리합니다. 1편에서는 모든 개념을 다 배우기보다, "앞으로 무엇을 왜 배우는가"를 잡는 데 집중합니다.

이번 글에서 먼저 잡을 용어

  1. 컴파일: 사람이 쓴 C 코드를 컴퓨터가 실행할 수 있는 프로그램으로 바꾸는 과정
  2. 실행 파일: 컴파일이 끝난 뒤 실제로 실행할 수 있는 프로그램 파일
  3. 메모리: 변수와 데이터를 저장하는 바이트 단위 공간

앞으로 배울 용어 미리 보기

  1. 포인터: 메모리 주소를 저장하는 변수로, 8편에서 본격적으로 다룹니다.
  2. 바이너리: 사람이 읽는 소스 코드와 달리 컴퓨터가 직접 실행할 수 있는 형태의 파일입니다.

핵심 개념

C 트랙 로드맵(학습 순서 지도)은 아래와 같습니다. 중요한 점은, C를 "문법 목록"으로 외우는 것이 아니라 "코드가 실제로 실행되는 흐름"으로 이어서 이해하는 것입니다.

회차 주제 핵심 역량
01 왜 지금 C를 공부할까 학습 이유와 로드맵 이해
02 C 개발 환경 준비와 첫 컴파일 gcc/clang 실행 흐름 익히기
03 변수와 기본 자료형 정수·실수·문자와 메모리 크기 감각
04 연산자와 형 변환 계산 규칙과 타입 변환 이해
05 조건문과 반복문 분기·반복 제어 패턴
06 함수로 코드 나누기 선언·정의·반환값 설계
07 배열과 문자열 연속 메모리와 문자열 표현 이해
08 포인터 기초 주소와 역참조 감각 익히기
09 배열과 포인터의 관계 포인터 산술과 인자 전달 이해
10 struct, enum, typedef 데이터 구조 설계
11 파일 분리와 헤더 파일 .c/.h 역할 구분
12 입력과 출력, 파일 처리 stdio.h 기반 입출력 익히기
13 동적 메모리 할당 malloc, free와 수명 관리
14 메모리 오류와 디버깅 누수·잘못된 접근 추적
15 전처리기와 매크로 #include, #define 이해
16 저장 기간과 스코프 static, extern과 변수 수명
17 함수 포인터와 콜백 동작을 전달하는 패턴 익히기
18 비트 연산과 저수준 감각 플래그·마스킹·하드웨어 친화적 사고
19 빌드 자동화와 프로젝트 구성 Makefile과 다중 파일 관리
20 캡스톤: 텍스트 기반 시스템 도구 만들기 파일·구조체·포인터·빌드 통합

1~5편은 C 문법과 실행 흐름을 익히는 토대, 6~10편은 함수와 메모리 구조를 연결하는 블록, 11~15편은 파일 분리와 메모리 관리 같은 실전 운용 블록, 16~20편은 더 낮은 수준의 제어 감각과 프로젝트 구성 능력을 다지는 확장 블록입니다.

  • 1~5편을 마치면 간단한 계산, 입력 처리, 반복 출력 프로그램을 스스로 만들 수 있습니다.
  • 6~10편을 마치면 배열과 구조체로 여러 데이터를 묶고 함수로 나눠 다룰 수 있습니다.
  • 11~15편을 마치면 파일을 읽고 메모리를 관리하는 조금 더 실전적인 프로그램을 작성할 수 있습니다.
  • 16~20편을 마치면 여러 파일로 나뉜 프로젝트를 빌드하고 시스템 도구 형태의 결과물까지 연결할 수 있습니다.

시리즈 설계 철학은 "코드가 메모리에서 어떻게 움직이는지 설명할 수 있어야 다음 단계로 갈 수 있다"는 한 문장으로 요약됩니다.

  • 실행 원리 중심: 문법만 외우기보다 컴파일, 실행 파일, 메모리 같은 실행 원리를 함께 이해합니다.
  • 작은 코드, 큰 관찰: 짧은 예제를 직접 실행하고, 코드 한 줄이 어떤 결과로 이어지는지 관찰합니다.
  • 시스템 감각 확장: 문자열, 파일, 동적 메모리, 빌드 도구까지 이어지도록 구성해 이후 운영체제나 임베디드 학습으로 연결합니다.
기초 문법자료형 · 연산자 · 제어문메모리 감각배열 · 문자열 · 포인터실전 구조화struct · 파일 분리 · 동적 메모리저수준 확장함수 포인터 · 비트 연산 · 빌드

로드맵에서 말하는 핵심 역량은 "그 회차를 마친 뒤, 코드가 왜 그렇게 동작하는지 직접 설명할 수 있는 능력"을 뜻합니다.

코드로 따라하기

가장 먼저 볼 것은 "C 코드는 컴파일을 거쳐 실행된다"는 사실입니다. 아래 예제는 가장 작은 형태의 C 프로그램입니다.

#include <stdio.h>

int main(void) {
    printf("Hello, C!\n");
    return 0;
}

main은 프로그램이 시작되는 함수입니다. printf는 화면에 문자열을 출력하는 함수이고, return 0;은 프로그램이 정상 종료되었다는 신호입니다.

이 코드를 hello.c라는 파일에 저장한 뒤 컴파일하면, 소스 코드와는 별도의 실행 파일이 만들어집니다.

clang hello.c -o hello
./hello

여기서 hello.c는 사람이 읽는 소스 코드이고, hello는 컴퓨터가 실행하는 파일입니다. 2편에서는 이 과정을 더 천천히 분해해 전처리, 컴파일, 링크 흐름까지 확인할 예정입니다.

변수는 메모리에 값을 저장합니다. C에서는 값의 종류에 따라 자료형을 먼저 선언해야 합니다. 그 이유는 컴파일러가 "얼마나 큰 공간이 필요한지"를 알아야 하기 때문입니다.

#include <stdio.h>

int main(void) {
    int age = 17;
    char grade = 'A';

    printf("age = %d\n", age);
    printf("grade = %c\n", grade);
    printf("sizeof(int) = %zu\n", sizeof(int));
    printf("sizeof(char) = %zu\n", sizeof(char));
    return 0;
}

int는 정수, char는 문자 하나를 저장하는 자료형입니다. 보통 char는 1바이트이고, int 크기는 환경에 따라 다를 수 있습니다. 이런 차이를 직접 확인하는 경험이 이후 배열, 문자열, 포인터를 이해하는 바탕이 됩니다.

포인터는 C를 배우는 이유이자 가장 많이 헷갈리는 지점이기도 합니다. 다만 1편에서는 포인터를 완전히 이해하려 애쓰기보다, "C에서는 값뿐 아니라 메모리 주소도 다룬다"는 사실만 기억해 두면 충분합니다. 8편에서 주소, 역참조, 배열과의 관계를 따로 묶어 천천히 다룰 예정입니다.

왜 중요한가

C를 배우는 이유는 단순히 오래된 언어를 경험하기 위해서가 아닙니다.

  • 운영체제, 임베디드, 일부 게임 엔진과 데이터베이스처럼 성능과 자원 제어가 중요한 소프트웨어의 바닥 구조를 이해하는 데 도움이 됩니다.
  • Python이나 JavaScript에서는 가려져 있던 메모리와 실행 흐름을 직접 다루며 디버깅 감각을 기를 수 있습니다.
  • 포인터, 배열, 파일, 빌드 과정을 익히면 다른 언어를 배울 때도 "내 코드가 실제로 어디서 어떻게 도는가"를 더 분명하게 떠올릴 수 있습니다.

이 글에서 정리한 핵심은 세 가지입니다.

  • C는 문법만 외우기보다 실행 원리를 이해할 때 더 강한 언어라는 점
  • 메모리 감각과 포인터 이해가 시리즈 전체를 묶는 중심축이라는 점
  • 앞으로의 학습이 기초 문법에서 시스템 도구 만들기로 자연스럽게 확장된다는 점

이후 학습은 아래 블록을 순서대로 밟습니다.

  • 기초 블록 (1~5): 자료형, 연산자, 조건문, 반복문으로 코드 흐름을 먼저 읽습니다.
  • 메모리 블록 (6~10): 함수, 배열, 문자열, 포인터, 구조체로 데이터를 어떻게 다루는지 연결합니다.
  • 운용 블록 (11~15): 파일 분리, 입출력, 동적 메모리, 디버깅, 전처리기를 통해 실전 코드를 다룹니다.
  • 확장 블록 (16~20): 저장 기간, 함수 포인터, 비트 연산, 빌드 자동화, 캡스톤으로 저수준 제어 감각을 키웁니다.

각 편의 예제는 작아 보여도 다음 편의 개념을 이해하는 발판이 되므로, 실행 결과와 메모리 흐름을 함께 기록하며 따라오는 것이 좋습니다.

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 사용 가능 여부부터 확인하세요.

실습

  • 따라 하기: Hello, C! 예제를 직접 컴파일해 보고, 소스 코드 파일과 실행 파일이 어떻게 나뉘는지 메모합니다.
  • 확장하기: 변수 예제에 float height = 172.4f;를 추가하고 sizeof(float)까지 출력해 자료형마다 크기가 다를 수 있음을 확인합니다.
  • 디버깅: printf의 서식 지정자를 일부러 %d, %c, %f로 바꿔 보며 어떤 출력이 어색해지는지 비교합니다.
  • 완료 기준: 컴파일, 실행 파일, 자료형, 메모리를 각각 한 문장으로 설명하고 두 예제를 직접 실행해 결과를 해석할 수 있으면 됩니다.

마무리

C는 "불편한 옛날 언어"라기보다 메모리와 실행 흐름을 직접 보여 주는 언어에 가깝습니다. 시작은 조금 더 느릴 수 있지만, 한 번 이해하고 나면 이후에 배우는 다른 언어들의 숨은 동작까지 더 잘 보이게 됩니다. 다음 글에서는 Mac에서 C 개발 환경을 준비하고 첫 컴파일을 직접 해 보겠습니다.

💬 댓글

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