- 순서
- C언어
- C++ 언어
- C와 C++언어의 차이점
- C언어
- 시스템 프로그래밍을 위한 절차지향적인 언어이다.
- 특징
- 운영체제인 유닉스 개발을 위해 만들어졌으며, 하드웨어 제어가 필요하여 고수준 언어임에도 저수준 언어의 특성을 갖게됨.
- 메모리 주소에 직접 접근하여 데이터를 조작하고, 프로세서를 제어하는 기능을 제공함.
- 하드웨어를 효율적으로 제어하여 프로그램의 실행 성능을 높일 수 있음.
- 특정 하드웨어에 종속되지 않고 다양한 컴퓨터 시스템에서 실행될 수 있어 이식성이 뛰어나며 예측 가능한 성능을 중시한다.
- 간결한 언어가 핵심으로 문법과 표준 라이브러리가 비교적 작아 학습 비용이 낮고, 빌드 체인도 단순함.
- 간결하다는 의미는 문법 요소가 적고, 추상화 도구가 단순하며 표준 라이브러리 규모가 작은편을 의미함
- 언어는 간단하지만, 문제 해결의 어려움 => 언어가 책임을 지지 않고, 안정성과 추상화를 프로그래머가 직접 만들어야하여 안전하고 유지보수 가능한 코드를 작성하려면 깊은 이해가 필요하기 때문
- 개념
- VLA
- 배열 크기를 런타임 값으로 정하는 문법
- 보통 스택에 할당되므로 큰 크기를 쓰면 스택 오버플로우의 위험을 가짐
- 런타임 크기이므로 sizeof 결과는 컴파일타임 상수가 아님
- 이식성과 안정성 문제로 C++에서 사용하면 표준 위배됨
- VLA
- 주요 활용 분야
- 시스템을 제어하는 운영체제 개발
- 특정 하드웨어에 최적화된 기능을 구현할 때 쓰이는 임베디드 시스템에 이용됨.
- 하드웨어의 저수준 제어가 필요한 다양한 시스템 프로그래밍
- C++언어
- C언어를 기반으로 객체 지향 프로그래밍(OOP) 개념을 추가하여 확장한 객체 지향 프로그래밍 언어이다.
- 특징
- C언어의 확장판으로 C언어의 기본 문법, 데이터 타입, 포인터 등을 그대로 계승하여 사용함
- 추상화, 상속, 다형성, 캡슐화와 같 객체 지향 프로그래밍의 주요 개념을 지원하여 복잡한 프로그램을 효율적으로 개발할 수 있도록 도움.
- 객체 지향 외에대 절차 지향, 일반화 프로그래밍 등의 여러 프로그래밍 패러다임을 지원하는 범용 프로그래밍 언어임.
- 하드웨어에 직접적인 접근이 가능하며, 실행 효율이 높아 성능이 중요한 분야에서 사용됨.
- 핵심 개념
- OOP
- RAII: 생성자/소멸자 기반의 자원관리
- 템플릿/제네릭: 컴파일 타임 다형성, 표준 컨테이너/알고리즘(STL)과 결합됨.
- 예외/RTTI/연산자 오버로딩/참조형 등의 풍푸한 기능이 있음
- 주요 활용 분야
- 운영체제 커널, 시스템 유틸리티 등 하드웨어를 제어하는 시스템 프로그래밍에 사용됨
- 높은 성능을 요구하는 게임 엔진 및 게임 클라이언트 개발에 널리 활용됨
- 특정 하드웨어에 최적화된 기능을 구현하는데 적합하여 임베디드 시스템에 이용됨
- C와 C++언어의 차이점
| 구분 | C | C++ |
| 패러다임 | 절차적 | 다중(절차 + 객체 + 제네릭 + 함수형) |
| 메모리 관리 | 수동(malloc/free) | RAII, new/delete, 스마트 포인터 ,컨테이너 |
| 추상화 수단 | 함수, struct 매크로 | 클래스/상속/가상함수, 템플릿, 연산자/함수 오버로딩 |
| 예외 처리 | 예외처리 없음(에러코드/errno) | 예외(try.catch).noexcept |
| 타입 시스템 | 비교적 단순함 | 더 강력함(참조형, 오버로딩, 템플릿, constexpr) |
| 표준 라이브러리 | 작음(stdio, string, math 등) | 매우 큼(STL 컨테이너/알고리즘/입출력/동시성 등) |
| 초기화/구문 | C99 지정자 초기화 등, VLA(옵션) | 풍부한 초기화(리스트/집합체), VLA 비표준(확장) |
| 빌드/링키지 | 단순, C ABI 안정적 | Name magling, ODR 규칙, ABI 민감 |
| 서로간 호환성 | - | C는 C++의 부분집합은 아님 (미세 차이와 비호환 존재) |
- 게임 프로그래밍에 C++를 많이 쓰는 이유
- C++는 고수준 추상화를 쓰더라도 필요 없으면 비용이 발생하지 않는다는 철학을 가지기 때문에 컴파일 타임 최적화로 네이티브 C 수준 성능 확보가 쉬움
- 포인터/직렬화/정렬/캐시 지역성을 직접 다룰 수 있어 GPU, 렌더러, 물리엔진 같은 하드웨어 밀접 코드에 유리하기 때문
- RAII로 인한 결정적 자원관리: 소멸자가 자동으로 자원을 해제하므로, 리소스 정리 시점이 예측 가능함(GC가 없는 환경에서 매우 중요함)
- 대형 코드베이스 설계에 유리하고, 표준 라이브러리와 기존 엔진, 서드파티 툴체인이 C++ 중심으로 발달해있기 때문
- 수십 년간 쌓은 게임용 라이브러리, 툴, 엔진 코드베이스가 C++로 되어있음
- 런타임 오버헤드 회피: GC로 인한 프레임 드랍 위험 때문에 핵심 루프는 네이티브(기계어(바이너))로 구현하는 경우가 많기 때문
'C++' 카테고리의 다른 글
| [C++]포인터와 레퍼런스 (0) | 2025.09.02 |
|---|---|
| [C++]클래스와 구조체 (2) | 2025.09.01 |
| [C++]전위/후위연산자 (0) | 2025.08.06 |
| [C++] ObjectPooling(오브젝트 풀) (0) | 2025.08.04 |
| [C++]Rvalue/Lvalue (0) | 2025.07.22 |