← C 강의 목록으로
🚀
시작하기
gcc · Make · OS별 설치 · 컴파일 옵션

시작하기 — 환경 셋업과 빌드

CLI(터미널) 환경에서 진행하는 C 학습의 첫 발걸음. gcc·Make 를 OS별로 설치하고, 단일 파일 빌드부터 디버그 옵션·Makefile 까지 한 번에 익힙니다.

gccMake환경설치컴파일 옵션
소요 시간
1시간
난이도
📊 완전 초보
선수 조건
🎯 없음 (터미널 사용 정도)
결과물
gcc/Make 가 동작하는 환경 + 학습용 빌드 옵션 이해

이 강의에서 배우는 것

  • 1C 언어 문법과 핵심 개념을 **예제 중심**으로 학습
  • 2단계(Level)별로 점진적으로 난이도 상승
  • 3각 단원마다 **실습 예제 → 과제 → 정답** 흐름으로 자기 주도 학습 가능
  • 4모든 코드는 **CLI(명령줄)** 에서 컴파일/실행

개발 환경

본 저장소는 다음 환경에서 검증되었습니다.

항목버전
OSLinux (Ubuntu 24.04)
컴파일러gcc 13.3.0
표준C11 (`-std=c11`)
빌드 도구GNU Make

gcc 설치 경로

본 저장소가 검증된 환경의 실제 경로입니다.

항목경로
실행 파일`/usr/bin/gcc`
컴파일러 백엔드 (`cc1`)`/usr/libexec/gcc/x86_64-linux-gnu/13/cc1`
라이브러리/내부 검색 루트`/usr/lib/gcc/x86_64-linux-gnu/13/`
표준 헤더 (예: `stdio.h`)`/usr/include/`

환경 확인

bash
which gcc                       # /usr/bin/gcc
gcc --version                   # gcc 13.3.0
gcc -print-prog-name=cc1        # cc1 실제 경로
gcc -print-search-dirs          # 라이브러리/프로그램 검색 경로
make --version

OS별 설치 경로 / 설치 방법

OS설치 명령기본 설치 경로
Ubuntu / Debian`sudo apt install build-essential``/usr/bin/gcc`
Fedora / RHEL`sudo dnf install gcc make``/usr/bin/gcc`
macOS (Homebrew)`brew install gcc``/opt/homebrew/bin/gcc-14` (Apple Silicon) / `/usr/local/bin/gcc-14` (Intel)
macOS (Xcode CLI Tools)`xcode-select --install``/usr/bin/gcc` (실제로는 clang)
Windows (MSYS2 UCRT64)`pacman -S mingw-w64-ucrt-x86_64-gcc``C:\msys64\ucrt64\bin\gcc.exe`
Windows (MinGW-w64)인스톨러 사용`C:\mingw64\bin\gcc.exe`

컴파일러 다운로드 경로 (공식)

컴파일러 / 도구다운로드 페이지
**GCC** (소스, 공식 미러)https://gcc.gnu.org/mirrors.html
**GCC** 릴리스 아카이브https://ftp.gnu.org/gnu/gcc/
**MinGW-w64** (Windows용 GCC)https://www.mingw-w64.org/downloads/
**MSYS2** (Windows GCC 패키지 매니저)https://www.msys2.org/
**TDM-GCC** (Windows 단순 인스톨러)https://jmeubank.github.io/tdm-gcc/ (홈) · https://jmeubank.github.io/tdm-gcc/download/ (다운로드)
**WinLibs** (Windows GCC 바이너리 빌드)https://winlibs.com/
**LLVM / Clang** (전 OS)https://releases.llvm.org/
**Apple Xcode Command Line Tools**https://developer.apple.com/download/all/
**Homebrew** (macOS / Linux)https://brew.sh/
**MSYS2 GCC 패키지 검색**https://packages.msys2.org/queue
**GNU Make**https://www.gnu.org/software/make/
ℹ️

강의 환경(Ubuntu)은 패키지 매니저 설치를 권장합니다. 소스 빌드는 시간이 오래 걸립니다.

초보자 추천 — OS별로 한 가지씩

처음이라면 아래 조합이 가장 막히지 않습니다.

OS추천 도구설치
**Windows****MSYS2 (UCRT64)** — 최신 GCC + 패키지 매니저로 업데이트 쉬움인스톨러 실행 후 `pacman -S mingw-w64-ucrt-x86_64-gcc`
Windows (간편)**TDM-GCC** — 한 번 설치로 끝내고 싶을 때인스톨러 실행만 하면 됨
**macOS****Xcode Command Line Tools** — `gcc` 명령은 clang이지만 학습용으로 충분터미널에서 `xcode-select --install`
**Linux (Ubuntu/Debian)****build-essential**`sudo apt install build-essential`

에디터는 [**VS Code** + C/C++ 확장](https://code.visualstudio.com/docs/languages/cpp) 조합을 권장합니다. 디버거·자동완성·빌드가 GUI에서 한 번에 됩니다. 좀 더 무거운 통합 환경을 원한다면 [**CLion**](https://www.jetbrains.com/clion/)도 좋은 선택입니다.

디렉터리 구조

text
Lecture_C/
├── 01_기초/                # Level 1: 입문자
│   ├── 01_HelloWorld/
│   ├── 02_변수와_자료형/
│   ├── 03_입출력/
│   └── 04_연산자/
├── 02_중급/                # Level 2: 제어 흐름과 자료 구조
│   ├── 01_조건문/
│   ├── 02_반복문/
│   ├── 03_배열/
│   └── 04_문자열/
├── 03_고급/                # Level 3: 핵심 응용
│   ├── 01_포인터/
│   ├── 02_함수/
│   └── 03_구조체/
├── 04_심화/                # Level 4: 실전
│   ├── 01_파일입출력/
│   └── 02_동적메모리/
├── Makefile                # 일괄 빌드/실행 스크립트
└── README.md

각 단원 폴더는 다음과 같이 구성됩니다.

text
NN_단원명/
├── README.md           # 강의 본문 (개념 + 예제 설명)
├── src/                # 실습 예제 소스 코드
│   ├── ex01_xxx.c
│   └── ...
└── homework/
    ├── README.md       # 과제 문제
    └── answer/         # 과제 정답 코드
        └── hw01.c

빌드 & 실행

단일 파일 빌드 — 가장 간단한 형태

처음에는 옵션 없이 시작해도 충분합니다.

bash
gcc hello.c -o hello   # 컴파일
./hello                 # 실행
  • `gcc`: GNU C 컴파일러 호출
  • `hello.c`: 입력 소스 파일
  • `-o hello`: 결과 실행 파일 이름. 빠뜨리면 기본값 `a.out`이 생성됨
  • `./hello`: 현재 디렉터리(`.`)의 `hello`를 실행

단일 파일 빌드 — 학습용 권장 형태

경고와 표준을 명시해서 잠재적 버그를 미리 잡습니다.

bash
gcc -std=c11 -Wall -Wextra -O2 -o hello 01_기초/01_HelloWorld/src/ex01_hello.c
./hello

각 옵션의 의미:

옵션의미빼면?
`-std=c11`2011년 제정된 C 표준 문법 사용컴파일러 기본 표준(보통 gnu17)으로 동작
`-Wall`"거의 모든" 경고 켜기 (미초기화 변수, 미사용 변수 등)잠재적 버그를 놓치기 쉬움
`-Wextra``-Wall` 외 추가 경고코드 품질 점검이 약해짐
`-O2`최적화 레벨 2 (성능과 디버깅의 균형)무방. 학습엔 `-O0`도 OK
`-o 이름`결과 실행 파일의 이름 지정기본값 `a.out`이 생성됨

디버깅에 적합한 옵션

학습 중에는 최적화를 끄고 디버그 정보를 넣는 편이 디버거(`gdb`) 사용에 유리합니다.

bash
gcc -std=c11 -Wall -g -O0 hello.c -o hello
  • `-g`: 디버그 정보 포함 (변수명/줄번호 등)
  • `-O0`: 최적화 안 함 (코드 순서가 그대로 유지되어 한 줄씩 추적 가능)

Makefile 사용 (루트)

bash
make all        # 전 단원 예제 빌드 (build/ 디렉터리에 출력)
make clean      # 빌드 산출물 제거
make list       # 빌드 가능한 예제 목록 보기

학습 순서

  1. 각 단원의 `README.md`를 읽고 개념을 이해합니다.
  2. `src/` 안의 예제를 직접 컴파일/실행하며 결과를 관찰합니다.
  3. `homework/README.md`의 과제를 **먼저 직접** 풀어봅니다.
  4. 막히면 `homework/answer/`의 정답을 참고합니다.

단계별 커리큘럼 요약

Level 1 — 기초

C 프로그램의 구조, 변수와 자료형, `printf`/`scanf`, 산술/비교/논리 연산자.

Level 2 — 중급

`if`/`switch`, `for`/`while`/`do-while`, 1·2차원 배열, 문자열 처리(`<string.h>`).

Level 3 — 고급

포인터의 개념과 활용, 함수 정의·호출·재귀, 구조체와 `typedef`.

Level 4 — 심화

`fopen`/`fread`/`fwrite` 기반 파일 입출력, `malloc`/`free` 동적 메모리 관리.

왜 지금도 C 인가 — 입문자가 알아두면 좋은 이유

C 언어는 1972년 Dennis Ritchie 가 만들어 50년이 넘었지만 여전히 **세계에서 가장 영향력 큰 언어 5위권 안**(TIOBE Index 기준)입니다. 학습 효율 측면에서 C 를 거치면 다른 언어가 "왜 이렇게 동작하는지" 가 명확해집니다.

1) C 가 깔린 곳 — 보이지 않는 인프라

  • **운영체제 커널** — Linux·Windows NT·macOS·iOS·Android 모두 C 기반
  • **임베디드** — 자동차 ECU·세탁기·전기밥솥·라우터 펌웨어
  • **언어 인터프리터** — Python·Ruby·PHP·Perl 인터프리터의 본체가 C
  • **데이터베이스 엔진** — SQLite·MySQL·PostgreSQL 코어
  • **그래픽·게임 엔진** — OpenGL·DirectX 드라이버, Doom·Quake 엔진

2) C 를 배우면 무엇이 달라지는가

Python·JavaScript 만 쓰면 "메모리", "포인터", "스택과 힙" 같은 개념이 추상적입니다. C 는 이것들을 **직접 다루지 않으면 코드가 동작하지 않는** 언어라 자연스럽게 체화됩니다. 그 결과 다른 언어의 성능 튜닝·디버깅도 훨씬 능숙해집니다.

c
#include <stdio.h>
int main(void) {
    int x = 42;
    int *p = &x;       // 포인터 — x 의 메모리 주소
    printf("x=%d, p=%p, *p=%d\n", x, (void*)p, *p);
    *p = 100;          // 포인터로 x 의 값을 변경
    printf("x=%d\n", x);   // 100 출력
    return 0;
}

3) 다음 언어로의 점프

C 를 익힌 뒤 C++/Rust/Go 같은 시스템 언어로 가는 길이 매우 짧아집니다. Rust 의 borrow checker, Go 의 goroutine 모두 "C 에서 골치 아팠던 문제를 어떻게 풀까" 의 답이라 C 배경 없이 배우면 의도가 잘 안 보입니다.

자주 묻는 질문 (FAQ)

Q1. C99·C11·C17·C23 중 어느 표준을 따라야 하나요?

**C11 (2011년) 이 사실상 현대 C 의 표준**입니다. `<stdatomic.h>`, `_Static_assert`, anonymous struct/union 등이 도입됐고 거의 모든 컴파일러 (gcc 4.9+, clang 3.1+) 가 지원합니다. C99 도 호환되지만 일부 모던 기능이 빠집니다. C23 은 2024년 ISO 비준이 끝났지만 아직 컴파일러 지원이 막 시작된 단계라 본 강의에서는 **C11 기준** 으로 진행합니다.

Q2. gcc 와 clang 중 어느 컴파일러를 쓰나요?

둘 다 무료·고품질이며 **동일한 표준 코드면 결과가 같습니다**. 일반적으로 **Linux 는 gcc**, **macOS 는 clang** (Xcode Command Line Tools 기본), **Windows 는 MSVC 또는 MinGW gcc** 가 일반적입니다. 학습용으로는 어느 것이든 OK. 진단 메시지 친절도는 clang 이, 최적화는 비등합니다.

Q3. C 와 C++ 중 어느 쪽을 먼저 배워야 하나요?

**C 를 먼저 배우는 것을 권장**합니다. C++ 은 C 의 상위집합이지만 객체지향·템플릿·RAII 같은 큰 개념을 동시에 익혀야 해 입문자에겐 너무 무겁습니다. 본 강의(16편) 정도로 C 를 마치고 C++ Primer 같은 책으로 가면 학습 부담이 절반으로 줄어듭니다.

Q4. C 코드에서 "세그멘테이션 폴트(segfault)" 가 자꾸 뜨는데?

**유효하지 않은 메모리 주소에 접근**할 때 발생합니다. 가장 흔한 원인: ① 초기화 안 된 포인터 사용, ② 이미 free() 된 메모리 접근, ③ 배열 범위 초과, ④ 스택 오버플로(재귀 깊이 과다). 디버깅 도구: `gcc -g` 로 빌드 후 `valgrind ./프로그램` 으로 정확한 위치 추적. 본 강의 8주차에서 자세히 다룹니다.

Q5. C 로 GUI 도 만들 수 있나요?

네, GTK (Linux), Win32 API (Windows), Cocoa (macOS) 등 OS 네이티브 API 로 가능합니다. 단 C 자체에 GUI 가 내장된 것은 아니고 외부 라이브러리 호출 형식이라 코드량이 많습니다. 빠르게 GUI 만들려면 C++ + Qt 또는 Rust + egui 같은 모던 스택이 더 효율적입니다. 학습 목적엔 C + GTK 도 좋습니다.

Q6. Windows 에서 C 시작하려는데 Visual Studio 와 MinGW 중 뭘?

**입문자는 MSYS2/MinGW (gcc) 권장**. 이유: Linux/macOS 와 같은 `gcc` 명령어, `make` 빌드 시스템을 그대로 쓸 수 있어 모든 교재·튜토리얼이 그대로 작동합니다. Visual Studio 의 MSVC 컴파일러는 강력하지만 명령어·옵션이 달라 학습 자료를 매번 번역해야 합니다. 본격 Windows 네이티브 개발 (DirectX, Win32 GUI) 단계에 들어가면 Visual Studio 로 바꾸는 게 자연스럽습니다.

💻 예제 (examples)

실제로 컴파일·실행해 결과를 확인할 수 있는 예제입니다.

hello.c메인 README 의 빌드 예제 — gcc 로 빌드해 ./hello 실행
CODE
#include <stdio.h>

int main(void) {
    printf("Hello, World!\n");
    return 0;
}
▶ 실행 결과
Hello, World!

📝 과제 (exercises)

직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.

과제 1

환경 설치 인증

목표: gcc 와 make 가 동작하는지 확인하고, hello.c 를 빌드해 첫 출력을 띄운다.

요구사항
  • which gcc 명령으로 경로 확인
  • gcc --version 으로 버전 확인 (gcc 13 권장)
  • gcc hello.c -o hello && ./hello 로 실행 → \"Hello, World!\" 출력
입출력 예시
Hello, World!
정답 코드 펼치기 / 접기
SOLUTION
#include <stdio.h>

int main(void) {
    printf("Hello, World!\n");
    return 0;
}
▶ 실행 결과
Hello, World!
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗