C (프로그래밍 언어)

TechPedia
LunaStev (토론 | 기여)님의 2025년 10월 17일 (금) 02:26 판

C는 1970년대 초 Bell LabsDennis Ritchie가 개발한 범용 프로그래밍 언어이다. 처음에는 Unix 운영체제를 구현하기 위해 만들어졌으며, 이후 수십 년 동안 다양한 시스템과 언어의 기반이 되었다. C는 단순하지만 강력한 구조를 가진 언어로, “현대 프로그래밍 언어의 어머니”로 불린다.

C
개발사
개발자 Dennis Ritchie
최초 출시 1972년
최신 버전 C23 (2023년)
지원 운영체제
플랫폼
프로그래밍 언어
라이선스 ISO/IEC 9899
웹사이트 [open-std.org 공식 사이트]


개요

C는 고급 언어와 저급 언어의 경계를 넘나드는 구조적 언어이다. 하드웨어 제어가 가능할 만큼 저수준에 가깝지만, 동시에 추상적 프로그래밍을 지원한다. 운영체제, 임베디드 시스템, 컴파일러, 게임 엔진 등 시스템 전반에서 폭넓게 사용된다. C++, Objective-C, C#, Rust, Go, Wave 등은 모두 C의 문법과 철학적 기반을 이어받았다.

역사

  • 1969년 – Ken Thompson이 BCPL을 단순화한 B language를 개발.
  • 1972년 – Dennis Ritchie가 B를 개선해 C를 완성.
  • 1973년 – Unix 커널이 대부분 C로 재작성되어 이식성이 크게 향상됨.
  • 1978년 – Brian W. Kernighan과 Ritchie가 The C Programming Language (일명 K&R C) 출판.
  • 1989년 – ANSI 표준 제정 (ANSI X3.159-1989, C89).
  • 1990년 – ISO 표준 승인 (C90).
  • 1999년C99 발표: // 주석, inline 함수, 가변 길이 배열(VLA), 복소수 타입 도입.
  • 2011년C11 발표: _Thread_local, _Atomic, _Static_assert 추가.
  • 2018년C17 발표: C11의 정리판.
  • 2023년C23 확정: nullptr, UTF-8 리터럴, typeof, 개선된 상수 표현 도입.

현재 표준화는 ISO/IEC JTC1/SC22/WG14 위원회에서 담당하고 있다.

철학

C의 설계 철학은 다음과 같다.

  • 프로그래머 중심의 제어권 — 하드웨어에 직접 접근할 수 있는 자유 제공.
  • 단순성과 명확성 — 복잡한 문법 대신 명확하고 직관적인 구조 추구.
  • 이식성과 성능의 조화 — 다양한 환경에서 동일하게 동작하는 고성능 코드.
  • 컴파일러 최적화 중심 — 언어보다 구현 효율을 우선시함.

이 철학은 C++, Rust, D, Wave 등 여러 언어 설계에 영향을 주었다.

주요 특징

  • 정적 타입 언어 — 모든 변수는 명시적 타입 선언이 필요함.
  • 컴파일 언어 — 실행 전에 기계어로 변환되어 고성능 제공.
  • 포인터 지원 — 메모리 주소를 직접 조작 가능.
  • 모듈 구조.h 헤더와 .c 소스 분리.
  • 표준 라이브러리 — 문자열 처리, 파일 입출력, 수학 연산 등 기본 기능 포함.
  • 이식성 — 동일한 코드를 다양한 시스템에서 재컴파일 가능.

기본 구조

C 프로그램은 하나 이상의 함수로 이루어지며, 그중 반드시 하나는 진입점인 main() 함수여야 한다.

#include <stdio.h>

int main(void) {
    printf("Hello, World!\n");
    return 0;
}

#include는 전처리기로 표준 라이브러리를 불러오며, main() 함수는 프로그램의 시작점을 정의한다. return 0;은 프로그램의 정상 종료를 의미한다.

자료형

  • 정수형: char, short, int, long, long long
  • 부동소수형: float, double, long double
  • 불리언형: _Bool (C99 이후)
  • 포인터형: 메모리 주소를 가리킴 (int *ptr)
  • 사용자 정의형: struct, union, enum, typedef

제어문

if (a > b) {
    printf("A is greater.\n");
} else {
    printf("B is greater.\n");
}

for (int i = 0; i < 10; i++) {
    printf("%d\n", i);
}

while (condition) {
    // 반복
}

break, continue, goto 등을 통해 흐름을 제어할 수 있다.

메모리와 포인터

C의 핵심은 포인터를 통한 메모리 직접 접근이다.

int a = 10;
int *ptr = &a;
printf("%d\n", *ptr);

&는 주소 연산자, *는 역참조 연산자이다. 이 기능은 강력하지만, 잘못 사용하면 세그멘테이션 오류 등 심각한 문제를 유발할 수 있다.

컴파일 과정

C 프로그램은 다음 단계를 거쳐 실행 파일로 완성된다.

  1. 전처리#include, #define 등 매크로 처리.
  2. 컴파일 — C 코드를 어셈블리어로 변환.
  3. 어셈블 — 어셈블리어를 오브젝트 파일(.o)로 변환.
  4. 링크 — 여러 오브젝트 파일과 라이브러리를 결합해 실행 파일 생성.

이 구조는 대부분의 현대 언어 컴파일러 설계에 영향을 미쳤다.

표준 매크로

매크로 설명
__STDC__ 표준 C를 지원할 경우 1로 정의됨.
__STDC_VERSION__ C 표준 버전 (예: 201112L은 C11).
__STDC_HOSTED__ Hosted 환경 여부 (표준 라이브러리 사용 가능 여부).
__func__ 현재 함수 이름을 문자열로 반환 (C99 이후).

활용

C는 현대 컴퓨팅의 거의 모든 기반에 사용된다.

다른 언어에 끼친 영향

C는 이후 등장한 거의 모든 언어의 기초가 되었다.

  • C++ — C 기반의 객체지향 확장.
  • Objective-C — C에 Smalltalk 메시징 구조를 결합.
  • C# — C 계열 문법을 기반으로 .NET 플랫폼용으로 설계.
  • Rust — C의 성능을 유지하면서 메모리 안전성을 확보.
  • Wave — C의 구조와 철학을 계승한 차세대 시스템 언어.

현대적 평가

C는 50년이 넘는 세월 동안 여전히 주요 언어로 사용되고 있다. 단순한 문법, 예측 가능한 성능, 하드웨어 친화성이 큰 장점이다. 반면 수동 메모리 관리와 타입 안전성 부족은 단점으로 지적된다. 그럼에도 불구하고 C는 운영체제, 임베디드, 커널, 컴파일러 등 시스템 프로그래밍의 중심 언어로서 여전히 중요한 위치를 차지한다.

관련 문서

참고 문헌