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가 오래 살아남은 대표 특징

  1. 논리·구조적인 시스템 프로그래밍에 적합
  2. 하드웨어 제어가 비교적 자유롭다
  3. 이식성이 높다 (같은 소스를 다른 환경용 컴파일러로 빌드)
  4. 간결한 문법으로 함축적인 코드 작성이 가능하다
  5. 고급이면서 저급 언어에 가까운 효율을 노릴 수 있다

3. 프로그램을 만드는 전체 흐름

3.1 개발 단계 (큰 그림)

  1. 목적·요구 정의 — 무엇을 하게 할 프로그램인가
  2. 설계 — 어떤 구조·알고리즘으로 풀 것인가
  3. 소스 작성 — 에디터로 .c 파일에 코드 입력
  4. 컴파일 / 링크(빌드) — 실행 파일로 변환 + 문법 검사
  5. 실행·테스트·디버깅 — 동작 확인, 수정
  6. 유지보수 — 이후 버그·기능 변경

에디터(작성)와 컴파일러(번역)가 기본 도구입니다. 요즘 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 프로그램의 기본 구조

전형적인 배치는 다음과 같습니다.

  1. 도입부 — 설명, #include, 매크로, (필요 시) 전역 변수·함수 원형
  2. main 함수 — 실행이 반드시 시작되는 곳. 프로그램마다 하나
  3. 그 밖의 함수 정의 — 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. 지금 실습할 것

아래 에디터에서 프로그램을 실행해 보세요.

  1. 그대로 실행해 Hello, C Programming! 출력 확인
  2. 문자열을 본인 이름으로 바꿔 다시 실행
  3. printf 줄 끝의 ; 를 지우고 실행 → 에러 메시지 관찰 후 복구
  4. (선택) printf를 print로 바꿔 보고 메시지 차이를 관찰
  5. (선택) 본문의 add 예제를 에디터에 붙여 넣고, 도입부·main·그 밖의 함수를 구분해 보기

로컬에서 연습할 때의 최소 명령 (3.4절과 같음):

clang hello.c -o hello
./hello

코드 실습 (C)

실행 결과가 여기에 표시됩니다.

확인 퀴즈

1. 사람과 기계어 사이에서 소스 코드를 번역하는 역할에 해당하는 것은?
2. C 프로그램 실행이 시작되는 함수는?
3. 소스 파일(.c)을 목적 파일로 바꾸는 단계는?
4. #include <stdio.h>의 역할은?
5. 변수 이름으로 사용할 수 없는 것은?
6. 에러와 경고의 차이로 가장 알맞은 것은?
7. #include <stdio.h>가 소스에 헤더를 붙이는 단계는?
8. 이 사이트에서 권장하는 프로그램 시작 형태는?

스스로 점검