시작하기 — 환경 셋업과 빌드
CLI(터미널) 환경에서 진행하는 C 학습의 첫 발걸음. gcc·Make 를 OS별로 설치하고, 단일 파일 빌드부터 디버그 옵션·Makefile 까지 한 번에 익힙니다.
이 강의에서 배우는 것
- 1C 언어 문법과 핵심 개념을 **예제 중심**으로 학습
- 2단계(Level)별로 점진적으로 난이도 상승
- 3각 단원마다 **실습 예제 → 과제 → 정답** 흐름으로 자기 주도 학습 가능
- 4모든 코드는 **CLI(명령줄)** 에서 컴파일/실행
개발 환경
본 저장소는 다음 환경에서 검증되었습니다.
| 항목 | 버전 |
|---|---|
| OS | Linux (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/` |
환경 확인
which gcc # /usr/bin/gcc
gcc --version # gcc 13.3.0
gcc -print-prog-name=cc1 # cc1 실제 경로
gcc -print-search-dirs # 라이브러리/프로그램 검색 경로
make --versionOS별 설치 경로 / 설치 방법
| 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/)도 좋은 선택입니다.
디렉터리 구조
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각 단원 폴더는 다음과 같이 구성됩니다.
NN_단원명/
├── README.md # 강의 본문 (개념 + 예제 설명)
├── src/ # 실습 예제 소스 코드
│ ├── ex01_xxx.c
│ └── ...
└── homework/
├── README.md # 과제 문제
└── answer/ # 과제 정답 코드
└── hw01.c빌드 & 실행
단일 파일 빌드 — 가장 간단한 형태
처음에는 옵션 없이 시작해도 충분합니다.
gcc hello.c -o hello # 컴파일
./hello # 실행- `gcc`: GNU C 컴파일러 호출
- `hello.c`: 입력 소스 파일
- `-o hello`: 결과 실행 파일 이름. 빠뜨리면 기본값 `a.out`이 생성됨
- `./hello`: 현재 디렉터리(`.`)의 `hello`를 실행
단일 파일 빌드 — 학습용 권장 형태
경고와 표준을 명시해서 잠재적 버그를 미리 잡습니다.
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`) 사용에 유리합니다.
gcc -std=c11 -Wall -g -O0 hello.c -o hello- `-g`: 디버그 정보 포함 (변수명/줄번호 등)
- `-O0`: 최적화 안 함 (코드 순서가 그대로 유지되어 한 줄씩 추적 가능)
Makefile 사용 (루트)
make all # 전 단원 예제 빌드 (build/ 디렉터리에 출력)
make clean # 빌드 산출물 제거
make list # 빌드 가능한 예제 목록 보기학습 순서
- 각 단원의 `README.md`를 읽고 개념을 이해합니다.
- `src/` 안의 예제를 직접 컴파일/실행하며 결과를 관찰합니다.
- `homework/README.md`의 과제를 **먼저 직접** 풀어봅니다.
- 막히면 `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 는 이것들을 **직접 다루지 않으면 코드가 동작하지 않는** 언어라 자연스럽게 체화됩니다. 그 결과 다른 언어의 성능 튜닝·디버깅도 훨씬 능숙해집니다.
#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)
실제로 컴파일·실행해 결과를 확인할 수 있는 예제입니다.
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}
Hello, World!📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
환경 설치 인증
목표: gcc 와 make 가 동작하는지 확인하고, hello.c 를 빌드해 첫 출력을 띄운다.
- which gcc 명령으로 경로 확인
- gcc --version 으로 버전 확인 (gcc 13 권장)
- gcc hello.c -o hello && ./hello 로 실행 → \"Hello, World!\" 출력
Hello, World!▶정답 코드 펼치기 / 접기
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}
Hello, World!