C (프로그래밍 언어): 두 판 사이의 차이
편집 요약 없음 |
편집 요약 없음 |
||
7번째 줄: | 7번째 줄: | ||
| 확장자 = ''.c'', ''.h'' | | 확장자 = ''.c'', ''.h'' | ||
| 라이선스 = '''ISO/IEC 9899''' | | 라이선스 = '''ISO/IEC 9899''' | ||
| 웹사이트 = | | 웹사이트 = https://www.open-std.org/jtc1/sc22/wg14/ | ||
}} | }} | ||
2025년 10월 17일 (금) 02:30 판
C | |
---|---|
![]() | |
개발사 | |
개발자 | Dennis Ritchie |
최초 출시 | 1972년 |
최신 버전 | C23 (2023년) |
지원 운영체제 | |
플랫폼 | |
프로그래밍 언어 | |
라이선스 | ISO/IEC 9899 |
웹사이트 | 공식 사이트 |
C는 1970년대 초 Bell Labs의 Dennis Ritchie가 개발한 범용 프로그래밍 언어이다. 처음에는 Unix 운영체제를 구현하기 위해 만들어졌으며, 이후 수십 년 동안 다양한 시스템과 언어의 기반이 되었다. C는 단순하지만 강력한 구조를 가진 언어로, “현대 프로그래밍 언어의 어머니”로 불린다.
개요
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 프로그램은 다음 단계를 거쳐 실행 파일로 완성된다.
- 전처리 —
#include
,#define
등 매크로 처리. - 컴파일 — C 코드를 어셈블리어로 변환.
- 어셈블 — 어셈블리어를 오브젝트 파일(
.o
)로 변환. - 링크 — 여러 오브젝트 파일과 라이브러리를 결합해 실행 파일 생성.
이 구조는 대부분의 현대 언어 컴파일러 설계에 영향을 미쳤다.
표준 매크로
매크로 | 설명 |
---|---|
__STDC__ |
표준 C를 지원할 경우 1로 정의됨. |
__STDC_VERSION__ |
C 표준 버전 (예: 201112L 은 C11).
|
__STDC_HOSTED__ |
Hosted 환경 여부 (표준 라이브러리 사용 가능 여부). |
__func__ |
현재 함수 이름을 문자열로 반환 (C99 이후). |
활용
C는 현대 컴퓨팅의 거의 모든 기반에 사용된다.
- 운영체제 — Unix, Linux, Windows, macOS 커널 등
- 임베디드 시스템 — 마이크로컨트롤러, IoT 기기, 가전제품 펌웨어
- 프로그래밍 언어 구현 — Python, Ruby, Lua 등 인터프리터 및 런타임
- 네트워크 및 데이터베이스 — Nginx, Apache, MySQL, PostgreSQL, Redis
- 게임 엔진 — Unreal Engine, Unity 내부의 저수준 모듈
다른 언어에 끼친 영향
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 공식 웹사이트.