1강 · 제1장 · 약 60분
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 소스에서 실행까지 (선행처리 포함)
코딩만으로 프로그램이 끝나지 않습니다. 실제로는 다음 순서를 거칩니다.
| 단계 | 하는 일 | 결과물 예 |
|---|---|---|
| 코딩 | 설계를 코드로 적어 저장 | sample.c (소스 파일) |
| 선행처리 | #include 등을 컴파일 전에 펼침 | 헤더가 붙은 소스 |
| 컴파일 | 소스를 기계어에 가까운 목적 코드로 번역, 문법 검사 | Windows: sample.obj / macOS·Linux: sample.o |
| 링킹(링크) | 목적 파일 + 라이브러리(예: printf 구현)를 연결 | sample.exe 또는 실행 파일 |
| 실행 | 만들어진 프로그램을 돌림 | 화면 출력 등 |
sample.c ──선행처리──▶ ──컴파일──▶ sample.o ──링크(+라이브러리)──▶ 실행 파일 ──실행──▶ 결과
#include <stdio.h>는printf를 실행하지 않습니다. “이런 함수가 있다”는 선언만 가져옵니다. 실제 코드는 링크 때 붙습니다.- 목적 파일만으로는 보통 실행되지 않습니다. 링크가 빠져 있으면
printf구현과 연결되지 않습니다. - IDE의 “빌드”와 이 사이트의 실행 버튼은 대개 선행처리 + 컴파일 + 링크를 한 번에 수행합니다.
3.3 컴파일러는 달라도 문법은 같다
도구는 여러 가지입니다. 리눅스 GCC, 맥 clang(Xcode Command Line Tools), 윈도우 Visual Studio·MinGW 등입니다. 제품마다 확장 기능은 달라도 ISO 표준 문법은 같습니다. 그래서 이 사이트 예제를 로컬에서 그대로 컴파일할 수 있습니다.
파일 이름은 반드시 파일명.c 로 저장하세요. Visual Studio에서 .cpp로 두면 C++로 컴파일되어, 교재와 다른 경고·에러가 날 수 있습니다.
3.4 로컬에서 컴파일하고 실행하기
사이트의 실행 버튼으로도 결과를 볼 수 있습니다. 다만 과제·시험·이후 강은 자기 컴퓨터에서 컴파일하는 연습이 필요합니다. 교재 1.3.3의 Dev-C++·Visual Studio 2019 화면은 버전이 이미 다릅니다. 아래는 같은 일을 하는 현재 명령입니다.
macOS / Linux
clang hello.c -o hello
./hello
gcc hello.c -o hello 도 같습니다. 맥에서 gcc는 종종 clang의 별칭입니다. 실행 파일에 .exe는 붙지 않습니다.
Windows (MinGW·clang 등이 PATH에 있는 경우)
gcc hello.c -o hello.exe
hello.exe
Visual Studio를 쓴다면 빈 프로젝트에 .c 파일을 넣고 빌드한 뒤, 디버그하지 않고 시작(Ctrl+F5)으로 실행합니다.
4. C 프로그램의 기본 구조
전형적인 배치는 다음과 같습니다.
- 도입부 — 설명,
#include, 매크로, (필요 시) 전역 변수·함수 원형 main함수 — 실행이 반드시 시작되는 곳. 프로그램마다 하나- 그 밖의 함수 정의 —
main에서 호출할 함수들
Hello World만 보면 3번이 안 보입니다. 교재 [그림 1-24]처럼 두 수를 더하는 함수를 붙이면 세 덩어리가 한눈에 들어옵니다. (scanf는 3강에서 다룹니다.)
이 예제 실행
실행 결과가 여기에 표시됩니다.
출력: 10 + 20 = 30
함수를 지금 직접 설계할 필요는 없습니다. 원형은 도입부, 정의는 main 아래라는 위치만 기억하세요.
꼭 기억할 규칙
main은 반드시 하나 있어야 한다 (진입점).- 함수 본문은 중괄호
{}로 감싼다. #include같은 선행처리 지시문을 제외하면, 대부분의 문장 끝에는 세미콜론;을 붙인다.printf를 쓰려면 보통#include <stdio.h>가 필요하다 (선언을 가져옴)."Hello\n"의\n은 줄바꿈입니다. 빠지면 다음 출력이 같은 줄에 이어 붙습니다.
교재 예제와 이 사이트가 다른 점
교재는 Visual Studio를 기준으로 void main() 과 #pragma warning(disable:4996) 를 씁니다. 시험에 교재 코드가 나와도 “틀린 문제”가 아닙니다. 이 사이트와 로컬 연습에서는 표준 형태를 씁니다.
| 교재에서 자주 보임 | 이 사이트 | 이유 |
|---|---|---|
void main() | int main(void) | ISO C의 권장 진입점. return 0; 으로 성공을 알림 |
#pragma warning(disable:4996) | 사용하지 않음 | Visual Studio 전용. 맥·clang·이 사이트에서는 필요 없음 |
sample.obj, sample.exe | 맥·리눅스는 sample.o, sample | 운영체제·컴파일러 차이 |
int main(void) 의 void는 “인자를 받지 않는다”는 뜻으로 읽는 입문이 안전합니다.
return 0; 은 운영체제에 성공을 알리는 관례입니다.
5. 프로그램을 이루는 기본 조각 (토큰)
컴파일러는 소스를 토큰 단위로 잘라 문법을 검사합니다. 입문에서 알아 둘 종류:
| 종류 | 의미 | 예 |
|---|---|---|
| 예약어(키워드) | 언어가 미리 정해 둔 단어. 이름으로 쓰면 안 됨 | int, return, if, for |
| 명칭(식별자) | 변수·함수 등 우리가 붙이는 이름 | sum, print_score |
| 상수 | 코드에 직접 적은 값 | 10, 'A', "hi" |
| 연산자 | 계산·대입 기호 | +, =, ++ |
| 설명문(주석) | 사람을 위한 메모. 실행에 영향 없음 | /* … */, // … |
지금은 종류만 구분해 두고, 문법 자체는 해당 강에서 배웁니다.
예약어 분류 (교재 1.4.2)
| 구분 | 예 |
|---|---|
| 자료형 | char, int, float, double, void … |
| 제어 | if, else, for, while, return, break … |
| 기억 부류 | auto, static, extern, register (7강) |
main은 예약어가 아니라 약속된 함수 이름(진입점)입니다. 교재는 “기타 예약어”로 묶어 두기도 합니다. 변수 이름으로 쓰지 마세요.
명칭(식별자) 규칙
- 영문·숫자·밑줄(
_) 조합 - 첫 글자는 영문 또는
_(숫자로 시작 불가) - 공백·
@등 특수문자 불가 (밑줄 제외) - 예약어 사용 불가 (
int를 변수 이름으로 못 씀) - 대소문자 구분 (
Sum≠sum)
올바른 예: score1, _total, For(예약어 for와 다름)
잘못된 예: 1score, my score, for, a@b
주석
/* 여러 줄 가능 */// 한 줄 주석(많은 현대 컴파일러·C99에서 사용)
주석은 어디에 넣어도 실행 결과에 영향을 주지 않습니다. 교재 예제처럼 파일 첫머리에 파일 이름·작성자·수정 일자를 적어 두면 나중에 읽기 좋습니다.
이 예제 실행
실행 결과가 여기에 표시됩니다.
컴파일러는 /* */ 와 // 뒤의 내용을 무시하므로, 위 예제에서 주석을 모두 지워도 결과는 sum = 7 로 같습니다.
6. 에러와 경고
빌드 과정에서 메시지가 나면 당황하지 말고 종류부터 구분합니다.
| 구분 | 의미 | 보통의 결과 |
|---|---|---|
| 에러(Error) | 문법상 명백히 잘못됨 → 번역 불가에 가까움 | 실행 파일 생성 실패. 반드시 고친다 |
| 경고(Warning) | 의심스럽거나 비권장이지만, 일단 빌드는 될 수 있음 | 실행은 될 수 있음. 읽고 타당한지 판단 후 수정 권장 |
흔한 에러 예
- 세미콜론 누락
- 중괄호 짝이 안 맞음
printf를print로 오타 → “선언되지 않은 함수” 계열 메시지
흔한 경고 예
- 변수를 선언만 하고 한 번도 사용하지 않음
- 권장하지 않는 옛 함수·형식을 사용
교재의 에러 예제 — printf를 print로 잘못 적음:
#include <stdio.h>
int main(void) {
print("Hello"); /* 'print'라는 함수는 없음 → "정의되지 않은 함수" 계열 에러 */
return 0;
}
교재의 경고 예제 — 변수 a를 선언만 하고 쓰지 않음:
#include <stdio.h>
int main(void) {
int a; /* 선언했지만 어디에도 쓰지 않음 → "사용되지 않는 변수" 경고 */
printf("Hello");
return 0;
}
에러는 실행 파일을 못 만들지만, 경고는 대개 실행 파일까지 만들어집니다. 메시지에는 보통 파일명, 줄 번호, 원인 요약이 들어 있습니다. “몇 번째 줄의 무엇을 고치면 되는지”를 찾는 연습이 디버깅의 시작입니다.
7. 지금 실습할 것
아래 에디터에서 프로그램을 실행해 보세요.
- 그대로 실행해
Hello, C Programming!출력 확인 - 문자열을 본인 이름으로 바꿔 다시 실행
printf줄 끝의;를 지우고 실행 → 에러 메시지 관찰 후 복구- (선택)
printf를print로 바꿔 보고 메시지 차이를 관찰 - (선택) 본문의
add예제를 에디터에 붙여 넣고, 도입부·main·그 밖의 함수를 구분해 보기
로컬에서 연습할 때의 최소 명령 (3.4절과 같음):
clang hello.c -o hello
./hello
코드 실습 (C)
실행 결과가 여기에 표시됩니다.