C (프로그래밍 언어): 두 판 사이의 차이

TechPedia
편집 요약 없음
편집 요약 없음
2번째 줄: 2번째 줄:
  | 이름      = C
  | 이름      = C
  | 로고      = [[File:C_logo.png|120px]]
  | 로고      = [[File:C_logo.png|120px]]
  | 개발자    = 데니스 리치
  | 개발자    = '''Dennis Ritchie'''
  | 출시일    = 1972년
  | 출시일    = '''1972년'''
  | 최신 버전 = C17 (2018년)
  | 최신 버전 = '''C23 (2023년)'''
  | 확장자    = .c, .h
  | 확장자    = ''.c'', ''.h''
  | 라이선스  = ISO/IEC 9899
  | 라이선스  = '''ISO/IEC 9899'''
  | 웹사이트  = https://www.open-std.org/jtc1/sc22/wg14/
  | 웹사이트  = [https://www.open-std.org/jtc1/sc22/wg14/ open-std.org]
}}
}}


'''C 언어'''는 1970년대 초 미국 벨 연구소의 '''데니스 리치(Dennis Ritchie)'''가 개발한 프로그래밍 언어이다.   
'''C'''는 1970년대 초 [[Bell Labs]]의 '''Dennis Ritchie'''가 개발한 범용 프로그래밍 언어이다.   
처음에는 유닉스 운영체제를 만들기 위해 설계되었지만, 이후 수십 년 동안 수많은 시스템과 소프트웨어의 기반이 되었다.   
처음에는 [[Unix]] 운영체제를 구현하기 위해 만들어졌으며, 이후 수십 년 동안 다양한 시스템과 언어의 기반이 되었다.   
오늘날에도 "현대 프로그래밍 언어들의 어머니"라고 불릴 만큼 큰 영향력을 가지고 있다.   
C는 단순하지만 강력한 구조를 가진 언어로, “현대 프로그래밍 언어의 어머니”로 불린다.
 
== 개요 ==
C는 고급 언어와 저급 언어의 경계를 넘나드는 구조적 언어이다. 
하드웨어 제어가 가능할 만큼 저수준에 가깝지만, 동시에 추상적 프로그래밍을 지원한다.   
운영체제, 임베디드 시스템, 컴파일러, 게임 엔진 등 시스템 전반에서 폭넓게 사용된다. 
[[C++]], [[Objective-C]], [[C#]], [[Rust]], [[Go]], [[Wave]] 등은 모두 C의 문법과 철학적 기반을 이어받았다.


== 역사 ==
== 역사 ==
* 1969년, 유닉스 초기 버전은 어셈블리어로 작성되었음.   
* '''1969년''' – Ken Thompson이 BCPL을 단순화한 '''B language'''를 개발.   
* 1972년, 데니스 리치가 B 언어를 개선하여 C 언어를 완성.   
* '''1972년''' – Dennis Ritchie가 B를 개선해 C를 완성.   
* 1978년, 브라이언 커니핸과 함께 ''The C Programming Language''(일명 K&R C)출판 → 사실상 표준 교재가 됨.   
* '''1973년''' – Unix 커널이 대부분 C로 재작성되어 이식성이 크게 향상됨. 
* 이후 ANSI, ISO 표준화 과정을 거쳐 지금까지도 꾸준히 개정되고 있음.   
* '''1978년''' – Brian W. Kernighan과 Ritchie가 ''The C Programming Language'' (일명 K&R C) 출판
* '''1989년''' – ANSI 표준 제정 (ANSI X3.159-1989, '''C89'''). 
* '''1990년''' – ISO 표준 승인 ('''C90'''). 
* '''1999년''' – '''C99''' 발표: <code>//</code> 주석, <code>inline</code> 함수, 가변 길이 배열(VLA), 복소수 타입 도입.   
* '''2011년''' – '''C11''' 발표: <code>_Thread_local</code>, <code>_Atomic</code>, <code>_Static_assert</code> 추가. 
* '''2018년''' – '''C17''' 발표: C11의 정리판. 
* '''2023년''' – '''C23''' 확정: <code>nullptr</code>, UTF-8 리터럴, <code>typeof</code>, 개선된 상수 표현 도입. 
 
현재 표준화는 ISO/IEC JTC1/SC22/WG14 위원회에서 담당하고 있다.
 
== 철학 ==
C의 설계 철학은 다음과 같다.
 
* '''프로그래머 중심의 제어권''' — 하드웨어에 직접 접근할 수 있는 자유 제공. 
* '''단순성과 명확성''' — 복잡한 문법 대신 명확하고 직관적인 구조 추구. 
* '''이식성과 성능의 조화''' — 다양한 환경에서 동일하게 동작하는 고성능 코드. 
* '''컴파일러 최적화 중심''' — 언어보다 구현 효율을 우선시함.   
 
이 철학은 [[C++]], [[Rust]], [[D]], [[Wave]] 등 여러 언어 설계에 영향을 주었다.


== 주요 특징 ==
== 주요 특징 ==
C 언어는 다음과 같은 특징을 가진다:
* '''정적 타입 언어''' — 모든 변수는 명시적 타입 선언이 필요함. 
* 간결한 문법과 높은 표현력  
* '''컴파일 언어''' — 실행 전에 기계어로 변환되어 고성능 제공.  
* 저수준 메모리 접근(포인터 지원) → 하드웨어 제어 가능   
* '''포인터 지원''' — 메모리 주소를 직접 조작 가능.  
* 플랫폼 간 이식성 (한 번 작성하면 다양한 기계에서 실행 가능)  
* '''모듈 구조''' — <code>.h</code> 헤더와 <code>.c</code> 소스 분리.  
* 표준 라이브러리 제공 → 파일 입출력, 문자열 처리, 수학 연산 등 기본 기능 지원  
* '''표준 라이브러리''' — 문자열 처리, 파일 입출력, 수학 연산 등 기본 기능 포함. 
* '''이식성''' — 동일한 코드를 다양한 시스템에서 재컴파일 가능.  


== 예제 코드 ==
== 기본 구조 ==
가장 유명한 예제는 "Hello, World!" 출력이다.
C 프로그램은 하나 이상의 함수로 이루어지며,
그중 반드시 하나는 진입점인 <code>main()</code> 함수여야 한다.


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
39번째 줄: 65번째 줄:
</syntaxhighlight>
</syntaxhighlight>


짧고 단순하지만, 이 코드 안에는 C의 특징이 잘 담겨 있다.   
<code>#include</code>는 전처리기로 표준 라이브러리를 불러오며, 
`#include`로 라이브러리를 불러오고, `main` 함수가 프로그램의 시작점이라는 규칙도 보인다.   
<code>main()</code> 함수는 프로그램의 시작점을 정의한다. 
<code>return 0;</code>은 프로그램의 정상 종료를 의미한다.
 
== 자료형 ==
* 정수형: <code>char</code>, <code>short</code>, <code>int</code>, <code>long</code>, <code>long long</code> 
* 부동소수형: <code>float</code>, <code>double</code>, <code>long double</code> 
* 불리언형: <code>_Bool</code> (C99 이후) 
* 포인터형: 메모리 주소를 가리킴 (<code>int *ptr</code>) 
* 사용자 정의형: <code>struct</code>, <code>union</code>, <code>enum</code>, <code>typedef</code> 
 
== 제어문 ==
<syntaxhighlight lang="c">
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) {
    // 반복
}
</syntaxhighlight>
 
<code>break</code>, <code>continue</code>, <code>goto</code> 등을 통해 흐름을 제어할 수 있다.
 
== 메모리와 포인터 ==
C의 핵심은 포인터를 통한 메모리 직접 접근이다.
 
<syntaxhighlight lang="c">
int a = 10;
int *ptr = &a;
printf("%d\n", *ptr);
</syntaxhighlight>
 
<code>&</code>는 주소 연산자, <code>*</code>는 역참조 연산자이다. 
기능은 강력하지만, 잘못 사용하면 세그멘테이션 오류 등 심각한 문제를 유발할 수 있다.
 
== 컴파일 과정 ==
C 프로그램은 다음 단계를 거쳐 실행 파일로 완성된다.
 
# '''전처리''' — <code>#include</code>, <code>#define</code> 등 매크로 처리. 
# '''컴파일''' — C 코드를 어셈블리어로 변환.   
# '''어셈블''' — 어셈블리어를 오브젝트 파일(<code>.o</code>)변환. 
# '''링크''' — 여러 오브젝트 파일과 라이브러리를 결합해 실행 파일 생성.   
 
이 구조는 대부분의 현대 언어 컴파일러 설계에 영향을 미쳤다.
 
== 표준 매크로 ==
{| class="wikitable"
! 매크로 !! 설명
|-
| <code>__STDC__</code> || 표준 C를 지원할 경우 1로 정의됨.
|-
| <code>__STDC_VERSION__</code> || C 표준 버전 (예: <code>201112L</code>은 C11).
|-
| <code>__STDC_HOSTED__</code> || Hosted 환경 여부 (표준 라이브러리 사용 가능 여부).
|-
| <code>__func__</code> || 현재 함수 이름을 문자열로 반환 (C99 이후).
|}


== 활용 ==
== 활용 ==
C는 지금도 다양한 분야에서 쓰인다:
C는 현대 컴퓨팅의 거의 모든 기반에 사용된다.
* 운영체제 (예: 유닉스, 리눅스, 윈도우 일부)  
 
* 임베디드 시스템 (가전제품, IoT 기기, 마이크로컨트롤러)  
* 운영체제 — [[Unix]], [[Linux]], [[Windows]], [[macOS]] 커널 등  
* 네트워크 장비와 데이터베이스 엔진   
* 임베디드 시스템 — [[마이크로컨트롤러]], [[IoT]] 기기, 가전제품 [[펌웨어]] 
* 다른 프로그래밍 언어의 구현 (예: Python 인터프리터, Lua, Ruby의 핵심은 C로 작성)  
* 프로그래밍 언어 구현 — [[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는 운영체제, 임베디드, 커널, 컴파일러 등  
시스템 프로그래밍의 중심 언어로서 여전히 중요한 위치를 차지한다.


== 관련 문서 ==
== 관련 문서 ==
* [[프로그래밍 언어]]   
* [[프로그래밍 언어]]   
* [[B (프로그래밍 언어)]] 
* [[C++]]   
* [[C++]]   
* [[Rust]]   
* [[Rust]]   
* [[Wave]]   
* [[Wave]]   
* [[어셈블리어]] 
* [[컴파일러]] 
* [[운영체제]] 
* [[Unix]] 


== 참고 자료 ==
== 참고 문헌 ==
* Dennis M. Ritchie & Brian W. Kernighan, ''The C Programming Language'' (1978).   
* Dennis M. Ritchie & Brian W. Kernighan, ''The C Programming Language'', 1978.   
* ISO/IEC 9899:2018 C 표준 문서.   
* ISO/IEC 9899:2023 (C23 표준 문서). 
* [https://www.open-std.org/jtc1/sc22/wg14/ ISO/IEC JTC1/SC22/WG14 공식 웹사이트].   


[[Category:프로그래밍 언어]]
[[Category:프로그래밍 언어]]
[[Category:C 계열 언어]]
[[Category:시스템 프로그래밍]]
[[Category:1970년대 소프트웨어]]

2025년 10월 17일 (금) 02:26 판

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


C는 1970년대 초 Bell LabsDennis 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 프로그램은 다음 단계를 거쳐 실행 파일로 완성된다.

  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는 운영체제, 임베디드, 커널, 컴파일러 등 시스템 프로그래밍의 중심 언어로서 여전히 중요한 위치를 차지한다.

관련 문서

참고 문헌