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

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

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

3.1 개발 단계 (큰 그림)

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

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

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

  1. 도입부 — 설명, #include, 매크로, (필요 시) 전역 변수·함수 원형
  2. main 함수 — 실행이 반드시 시작되는 곳. 프로그램마다 하나
  3. 그 밖의 함수 정의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 를 변수 이름으로 못 씀)
  • 대소문자 구분 (Sumsum)

올바른 예: score1, _total, For(예약어 for와 다름)
잘못된 예: 1score, my score, for, a@b

주석

  • /* 여러 줄 가능 */
  • // 한 줄 주석 (많은 현대 컴파일러·C99에서 사용)

주석은 어디에 넣어도 실행 결과에 영향을 주지 않습니다. 나중에 읽는 사람(미래의 나)을 위해 짧게 남기세요.


6. 에러와 경고

빌드 과정에서 메시지가 나면 당황하지 말고 종류부터 구분합니다.

구분의미보통의 결과
에러(Error)문법상 명백히 잘못됨 → 번역 불가에 가까움실행 파일 생성 실패. 반드시 고친다
경고(Warning)의심스럽거나 비권장이지만, 일단 빌드는 될 수 있음실행은 될 수 있음. 읽고 타당한지 판단 후 수정 권장

흔한 에러 예

  • 세미콜론 누락
  • 중괄호 짝이 안 맞음
  • printfprint로 오타 → “선언되지 않은 함수” 계열 메시지

흔한 경고 예

  • 변수를 선언만 하고 한 번도 사용하지 않음
  • 권장하지 않는 옛 함수·형식을 사용

메시지를 읽을 때 보통 파일명, 줄 번호, 원인 요약이 들어 있습니다. “몇 번째 줄의 무엇을 고치면 되는지”를 찾는 연습이 디버깅의 시작입니다.


7. 지금 실습할 것

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

  1. 그대로 실행해 Hello, C Programming! 출력 확인
  2. 문자열을 본인 이름으로 바꿔 다시 실행
  3. printf 줄 끝의 ; 를 지우고 실행 → 에러 메시지 관찰 후 복구
  4. (선택) printfprint로 바꿔 보고 메시지 차이를 관찰

로컬에서 연습할 때의 최소 명령 예 (환경에 따라 다름):

gcc hello.c -o hello
./hello

코드 실습 (C)

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

확인 퀴즈

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

스스로 점검