C (프로그래밍 언어)
C는 1970년대 초 Bell Labs의 Dennis Ritchie가 개발한 범용 프로그래밍 언어이다. 처음에는 Unix 운영체제를 구현하기 위해 만들어졌으며, 이후 수십 년 동안 다양한 시스템과 언어의 기반이 되었다. C는 단순하지만 강력한 구조를 가진 언어로, “현대 프로그래밍 언어의 어머니”로 불린다.
C | |
---|---|
![]() | |
개발사 | |
개발자 | Dennis Ritchie |
최초 출시 | 1972년 |
최신 버전 | C23 (2023년) |
지원 운영체제 | |
플랫폼 | |
프로그래밍 언어 | |
라이선스 | ISO/IEC 9899 |
웹사이트 | 공식 사이트 |
개요
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의 설계 철학은 다음과 같다.
- 프로그래머 중심의 제어권 — 하드웨어에 직접 접근할 수 있는 자유 제공.
- 단순성과 명확성 — 복잡한 문법 대신 명확하고 직관적인 구조 추구.
- 이식성과 성능의 조화 — 다양한 환경에서 동일하게 동작하는 고성능 코드.
- 컴파일러 최적화 중심 — 언어보다 구현 효율을 우선시함.
주요 특징
- 정적 타입 언어 — 모든 변수는 명시적 타입 선언이 필요함.
- 컴파일 언어 — 실행 전에 기계어로 변환되어 고성능 제공.
- 포인터 지원 — 메모리 주소를 직접 조작 가능.
- 모듈 구조 —
.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 프로그램은 다음 단계를 거쳐 실행 파일로 완성된다.
- 전처리 —
#include
,#define
등 매크로 처리. - 컴파일 — C 코드를 어셈블리어로 변환.
- 어셈블 — 어셈블리어를 오브젝트 파일(
.o
)로 변환. - 링크 — 여러 오브젝트 파일과 라이브러리를 결합해 실행 파일 생성.
이 구조는 대부분의 현대 언어 컴파일러 설계에 영향을 미쳤다.
표준 매크로
매크로 | 설명 |
---|---|
__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는 운영체제, 임베디드, 커널, 컴파일러 등 시스템 프로그래밍의 중심 언어로서 여전히 중요한 위치를 차지한다.
관련 문서
참고 문헌
- Dennis M. Ritchie & Brian W. Kernighan, The C Programming Language, 1978.
- ISO/IEC 9899:2023 (C23 표준 문서).
- ISO/IEC JTC1/SC22/WG14 공식 웹사이트.