1강 · 제1장 · 약 50분
C 언어의 개요
C의 정의·특징부터 컴파일/링크, 프로그램 구조, 토큰, 에러/경고까지 PDF 없이도 핵심을 익힙니다.
학습 목표
- 프로그래밍 언어·컴파일러의 역할을 설명할 수 있다
- C의 역사 배경과 대표 특징을 말할 수 있다
- 소스 → 컴파일 → 링크 → 실행 과정을 단계별로 이해한다
- C 프로그램의 기본 구조(도입부·main·기타 함수)를 설명한다
- 예약어·명칭·주석·세미콜론 규칙을 알고 Hello World를 작성·실행한다
- 에러와 경고의 차이를 구분하고 메시지를 읽는 방법을 안다
왜 이 강이 필요한가?
앞으로 배울 자료형, 제어문, 포인터는 모두 “소스 파일을 만들고 → 번역하고 → 실행한다” 는 큰 그림 위에 올라갑니다.
1강에서는 그 큰 그림과, 모든 C 프로그램이 공유하는 최소 규칙을 잡습니다. PDF를 펼치지 않아도 이 페이지만으로 핵심 개념을 익힐 수 있게 구성했습니다.
1. C 언어란? (정의)
컴퓨터는 결국 0과 1(기계어) 만 이해합니다. 사람이 쓰는 문장과 기계어 사이를 이어 주는 약속이 프로그래밍 언어이고, 그 약속을 기계어 쪽으로 번역하는 도구가 컴파일러입니다.
- 고급 언어(high-level): 사람에게 가깝다 (C, Python, Java …)
- 저급 언어(low-level): 기계에 가깝다 (어셈블리)
C는 고급 언어이면서도 메모리·하드웨어를 비교적 직접 다룰 수 있어, 흔히 “저급 언어 특성을 가진 고급 언어” 라고 부릅니다.
운영체제, 임베디드, 통신·제어, 성능이 중요한 기반 소프트웨어에서 여전히 널리 쓰이며, C++ / Java / C# 등 많은 언어의 문법·개념에도 영향을 주었습니다.
학습 팁: 문법을 외우기만 하지 말고, 예제를 읽고 → 한 줄 바꿔 보고 → 실행해 보며 감각을 쌓으세요.
2. 역사와 특징
| 항목 | 내용 |
|---|---|
| 탄생 | 1972년경 벨 연구소 데니스 리치(Dennis Ritchie). 유닉스(UNIX) 개발을 위해 |
| 배경 | 어셈블리만 쓰면 기종마다 다시 짜야 함 → 이식성과 하드웨어 제어를 함께 원함 |
| 표준 | ANSI C → ISO C90, 이후 C99 등. 교재·입문은 보통 C90 계열을 기본으로 함 |
C가 오래 살아남은 대표 특징
- 논리·구조적인 시스템 프로그래밍에 적합
- 하드웨어 제어가 비교적 자유롭다
- 이식성이 높다 (같은 소스를 다른 환경용 컴파일러로 빌드)
- 간결한 문법으로 함축적인 코드 작성이 가능하다
- 고급이면서 저급 언어에 가까운 효율을 노릴 수 있다
3. 프로그램을 만드는 전체 흐름
3.1 개발 단계 (큰 그림)
- 목적·요구 정의 — 무엇을 하게 할 프로그램인가
- 설계 — 어떤 구조·알고리즘으로 풀 것인가
- 소스 작성 — 에디터로
.c파일에 코드 입력 - 컴파일 / 링크(빌드) — 실행 파일로 변환 + 문법 검사
- 실행·테스트·디버깅 — 동작 확인, 수정
- 유지보수 — 이후 버그·기능 변경
에디터(작성)와 컴파일러(번역)가 기본 도구입니다. 요즘 IDE(Visual Studio, Dev-C++, VS Code + 확장 등)는 둘을 묶은 빌드 버튼으로 제공하는 경우가 많습니다.
3.2 C 프로그램이 “완성”되는 3단계
| 단계 | 하는 일 | 결과물 예 |
|---|---|---|
| 코딩 | 설계를 코드로 적어 저장 | sample.c (소스 파일) |
| 컴파일 | 소스를 기계어에 가까운 목적 코드로 번역, 문법 검사 | sample.obj / sample.o |
| 링킹(링크) | 목적 파일 + 라이브러리(예: printf 구현)를 연결 | sample.exe 또는 실행 파일 |
sample.c ──컴파일──▶ sample.o ──링크(+라이브러리)──▶ 실행 파일 ──실행──▶ 결과
- 목적 파일만으로는 보통 실행되지 않습니다. 링크가 빠져 있으면
printf같은 함수의 실제 코드와 연결되지 않습니다. - IDE의 “빌드”는 대개 컴파일 + 링크를 한 번에 수행합니다.
이 사이트의 실행 버튼도 같은 일(원격 컴파일·실행)을 대신 해 줍니다.
4. C 프로그램의 기본 구조
전형적인 배치는 다음과 같습니다.
- 도입부 — 설명,
#include, 매크로, (필요 시) 전역 변수·함수 원형 main함수 — 실행이 반드시 시작되는 곳. 프로그램마다 하나- 그 밖의 함수 정의 —
main에서 호출할 함수들 (아직 없어도 됨)
/* 도입부: 주석 + 헤더 포함 */
#include <stdio.h>
int main(void) { /* 시작점 */
printf("Hello\n"); /* 문장 끝에는 세미콜론 */
return 0; /* OS에 정상 종료 알림 */
}
꼭 기억할 규칙
main은 반드시 하나 있어야 한다 (진입점).- 함수 본문은 중괄호
{}로 감싼다. #include같은 선행처리 지시문을 제외하면, 대부분의 문장 끝에는 세미콜론;을 붙인다.printf를 쓰려면 보통#include <stdio.h>가 필요하다 (선언을 가져옴).
int main(void) 의 void는 “인자를 받지 않는다”는 뜻으로 읽는 입문이 안전합니다.
return 0; 은 운영체제에 성공을 알리는 관례입니다.
5. 프로그램을 이루는 기본 조각 (토큰)
컴파일러는 소스를 토큰 단위로 잘라 문법을 검사합니다. 입문에서 알아 둘 종류:
| 종류 | 의미 | 예 |
|---|---|---|
| 예약어(키워드) | 언어가 미리 정해 둔 단어. 이름으로 쓰면 안 됨 | int, return, if, for |
| 명칭(식별자) | 변수·함수 등 우리가 붙이는 이름 | sum, print_score |
| 상수 | 코드에 직접 적은 값 | 10, 'A', "hi" |
| 연산자 | 계산·대입 기호 | +, =, ++ |
| 설명문(주석) | 사람을 위한 메모. 실행에 영향 없음 | /* … */, // … |
명칭(식별자) 규칙
- 영문·숫자·밑줄(
_) 조합 - 첫 글자는 영문 또는
_(숫자로 시작 불가) - 공백·
@등 특수문자 불가 (밑줄 제외) - 예약어 사용 불가 (
int를 변수 이름으로 못 씀) - 대소문자 구분 (
Sum≠sum)
올바른 예: score1, _total, For(예약어 for와 다름)
잘못된 예: 1score, my score, for, a@b
주석
/* 여러 줄 가능 */// 한 줄 주석(많은 현대 컴파일러·C99에서 사용)
주석은 어디에 넣어도 실행 결과에 영향을 주지 않습니다. 나중에 읽는 사람(미래의 나)을 위해 짧게 남기세요.
6. 에러와 경고
빌드 과정에서 메시지가 나면 당황하지 말고 종류부터 구분합니다.
| 구분 | 의미 | 보통의 결과 |
|---|---|---|
| 에러(Error) | 문법상 명백히 잘못됨 → 번역 불가에 가까움 | 실행 파일 생성 실패. 반드시 고친다 |
| 경고(Warning) | 의심스럽거나 비권장이지만, 일단 빌드는 될 수 있음 | 실행은 될 수 있음. 읽고 타당한지 판단 후 수정 권장 |
흔한 에러 예
- 세미콜론 누락
- 중괄호 짝이 안 맞음
printf를print로 오타 → “선언되지 않은 함수” 계열 메시지
흔한 경고 예
- 변수를 선언만 하고 한 번도 사용하지 않음
- 권장하지 않는 옛 함수·형식을 사용
메시지를 읽을 때 보통 파일명, 줄 번호, 원인 요약이 들어 있습니다. “몇 번째 줄의 무엇을 고치면 되는지”를 찾는 연습이 디버깅의 시작입니다.
7. 지금 실습할 것
아래 에디터에서 프로그램을 실행해 보세요.
- 그대로 실행해
Hello, C Programming!출력 확인 - 문자열을 본인 이름으로 바꿔 다시 실행
printf줄 끝의;를 지우고 실행 → 에러 메시지 관찰 후 복구- (선택)
printf를print로 바꿔 보고 메시지 차이를 관찰
로컬에서 연습할 때의 최소 명령 예 (환경에 따라 다름):
gcc hello.c -o hello
./hello
코드 실습 (C)
실행 결과가 여기에 표시됩니다.