1단원 — Hello, World!
C 프로그래밍의 첫 단원입니다. 가장 단순한 프로그램을 통해 **C 프로그램의 뼈대 → 컴파일 → 실행**의 한 사이클을 직접 경험해 봅니다.
이 강의에서 배우는 것
- 1C 프로그램의 기본 구조(`#include`, `main`, `printf`, `return`)를 이해한다.
- 2`gcc`로 소스 파일을 컴파일하고 터미널에서 실행할 수 있다.
- 3이스케이프 시퀀스(`\n`, `\t`)와 주석을 사용할 수 있다.
왜 "Hello World"부터 시작하는가?
처음 보는 프로그램이라도 화면에 한 줄을 띄우는 것까지 성공하면, **환경(컴파일러, PATH, 한글 인코딩)이 정상**이라는 사실이 한 번에 검증됩니다. 그래서 거의 모든 언어 입문서가 이 예제로 시작합니다. "문법을 익힌다"기보다 **개발 사이클을 한 번 돌려보는** 것이 목적입니다.
핵심 개념
1) C 프로그램의 뼈대
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}각 줄을 분해해 봅니다.
| 요소 | 의미 |
|---|---|
| `#include <stdio.h>` | 표준 입출력 라이브러리(`printf`) 헤더를 포함시키는 **전처리 지시자** |
| `int main(void)` | 운영체제가 가장 먼저 호출하는 **진입점 함수**. 반환형은 `int` |
| `printf("...\n")` | 표준 출력(stdout)에 문자열 출력 |
| `return 0;` | "정상 종료"를 OS에 알리는 종료 코드 0 반환 |
2) 컴파일 한 번에 일어나는 4단계
소스 코드 한 파일을 실행 파일로 만드는 과정은 보이지 않지만 4단계로 구성됩니다.
hello.c hello (실행파일)
│ ▲
│ ① 전처리 ② 컴파일 ③ 어셈블 ④ 링크 │
└─► cpp ─► cc1 ─► as ─► ld ──────┘
(#include 펼침) (어셈블리 생성) (오브젝트) (라이브러리 결합)`gcc`는 이 네 단계를 한 번에 호출해 줍니다.
3) 이스케이프 시퀀스
문자열 안에서 특수한 동작을 하는 문자들입니다.
| 표기 | 의미 |
|---|---|
| `\n` | 줄바꿈 (newline) |
| `\t` | 탭 |
| `\\` | 역슬래시 자체 |
| `\"` | 큰따옴표 |
| `\0` | 널 문자(문자열의 끝) |
4) 주석
// 한 줄 주석 (C99 이후)
/* 여러 줄
주석 */주석은 컴파일러가 무시하므로 실행에 영향을 주지 않습니다.
예제로 보기
예제 1 — `ex01_hello.c` : 가장 단순한 출력
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}**실행 결과**
Hello, World!핵심: `\n`이 없으면 다음 프롬프트가 같은 줄에 붙습니다. 직접 `\n`을 지워 보세요.
예제 2 — `ex02_multiline.c` : 여러 줄 출력과 탭
printf("첫 번째 줄\n");
printf("두 번째 줄\n");
printf("탭\t으로 구분\n");
printf("한 번에\n여러 줄\n출력하기\n");**실행 결과**
첫 번째 줄
두 번째 줄
탭 으로 구분
한 번에
여러 줄
출력하기핵심: `printf` **한 번**에서도 `\n`이 여러 개면 줄이 여러 개로 나옵니다.
예제 3 — `ex03_comments.c` : 주석은 실행되지 않는다
// 한 줄 주석
/* printf("이 줄은 출력되지 않습니다."); */
printf("주석은 컴파일에 영향을 주지 않습니다.\n");**실행 결과**
주석은 컴파일에 영향을 주지 않습니다.핵심: 코드를 임시로 비활성화할 때 주석으로 감싸는 일이 잦습니다.
다른 시각으로 보기 — 카페 주문 비유
C 프로그램은 카페 주문서와 비슷합니다.
| 카페 | C 코드 |
|---|---|
| 메뉴판 | `<stdio.h>` 헤더(쓸 수 있는 함수 목록) |
| 주문 시작 | `int main(void) {` |
| 주문 항목 | `printf(...);` |
| 결제 완료 | `return 0;` |
주문이 없으면(=`main`이 비면) 카페는 그냥 문 닫고 종료합니다.
자주 하는 실수
- **세미콜론 누락**: `printf("hi")` 끝에 `;`이 없으면 컴파일 오류.
- **`#include` 빠뜨림**: `printf` 사용 시 `<stdio.h>` 누락 → "implicit declaration" 경고.
- **`Main` 대문자**: C는 대소문자 구분. 진입점은 반드시 `main`.
- **`printf("hi")`의 따옴표**: 큰따옴표(`"`)와 작은따옴표(`'`)는 다릅니다 (`'h'`는 한 문자).
- **한글이 깨짐**: 터미널이 UTF-8이 아니면 깨집니다. Linux/macOS는 보통 OK.
정리
- C 소스는 `#include`, `main`, 본문, `return`의 4부분으로 구성된다.
- `gcc -o 이름 파일.c`로 컴파일, `./이름`으로 실행.
- `printf`는 자동 줄바꿈을 하지 않으므로 `\n`을 직접 써야 한다.
- 주석은 컴파일에 영향이 없으니 자유롭게 활용한다.
- 한 사이클(작성→빌드→실행)이 막힘없이 돌아가도록 환경을 다듬는 것이 첫 목표.
직접 해 보기
cd src
gcc -std=c11 -Wall -o ex01 ex01_hello.c && ./ex01
gcc -std=c11 -Wall -o ex02 ex02_multiline.c && ./ex02
gcc -std=c11 -Wall -o ex03 ex03_comments.c && ./ex03응용:
- `ex01_hello.c`에서 `\n`을 지워 보고 출력이 어떻게 달라지는지 확인.
- `printf`를 한 번만 호출해 3줄을 출력해 보세요. (힌트: `"줄1\n줄2\n줄3\n"`)
💻 예제 (examples)
실제로 컴파일·실행해 결과를 확인할 수 있는 예제입니다.
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}
Hello, World!#include <stdio.h>
int main(void) {
printf("첫 번째 줄\n");
printf("두 번째 줄\n");
printf("탭\t으로 구분\n");
printf("한 번에\n여러 줄\n출력하기\n");
return 0;
}
첫 번째 줄
두 번째 줄
탭 으로 구분
한 번에
여러 줄
출력하기#include <stdio.h>
/*
* 이 프로그램은 주석 사용 예시입니다.
* 컴파일러는 주석을 무시합니다.
*/
int main(void) {
// 한 줄 주석: 메시지 출력
printf("주석은 컴파일에 영향을 주지 않습니다.\n");
/* printf("이 줄은 출력되지 않습니다."); */
return 0;
}
주석은 컴파일에 영향을 주지 않습니다.📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
문제 1 (hw01.c)
목표: 다음과 같은 자기소개를 정확히 출력하는 프로그램을 작성하세요.
- 파일명: hw01.c
이름: 홍길동
나이: 20
취미: 코딩▶정답 코드 펼치기 / 접기
#include <stdio.h>
int main(void) {
printf("이름: 홍길동\n");
printf("나이: 20\n");
printf("취미: 코딩\n");
return 0;
}
이름: 홍길동
나이: 20
취미: 코딩문제 2 (hw02.c)
목표: 다음 ASCII 아트를 출력하세요. 백슬래시(`\`)는 `\\`로 이스케이프해야 합니다.
- 파일명: hw02.c
/\_/\
( o.o )
> ^ <▶정답 코드 펼치기 / 접기
#include <stdio.h>
int main(void) {
printf(" /\\_/\\\n");
printf(" ( o.o )\n");
printf(" > ^ <\n");
return 0;
}
/\_/\
( o.o )
> ^ <