C++

[C++]C와 C++ 언어의 차이점

programmer-faust 2025. 9. 1. 11:10
  • 순서
    1. C언어
    2. C++ 언어
    3. C와 C++언어의 차이점
  • C언어
    1. 시스템 프로그래밍을 위한 절차지향적인 언어이다.
    2. 특징
      • 운영체제인 유닉스 개발을 위해 만들어졌으며, 하드웨어 제어가 필요하여 고수준 언어임에도 저수준 언어의 특성을 갖게됨.
      • 메모리 주소에 직접 접근하여 데이터를 조작하고, 프로세서를 제어하는 기능을 제공함.
      • 하드웨어를 효율적으로 제어하여 프로그램의 실행 성능을 높일 수 있음.
      • 특정 하드웨어에 종속되지 않고 다양한 컴퓨터 시스템에서 실행될 수 있어 이식성이 뛰어나며 예측 가능한 성능을 중시한다.
      • 간결한 언어가 핵심으로 문법과 표준 라이브러리가 비교적 작아 학습 비용이 낮고, 빌드 체인도 단순함.
        1. 간결하다는 의미는 문법 요소가 적고, 추상화 도구가 단순하며 표준 라이브러리 규모가 작은편을 의미함
      • 언어는 간단하지만, 문제 해결의 어려움 => 언어가 책임을 지지 않고, 안정성과 추상화를 프로그래머가 직접 만들어야하여 안전하고 유지보수 가능한 코드를 작성하려면 깊은 이해가 필요하기 때문
    3. 개념
      • VLA
        1. 배열 크기를 런타임 값으로 정하는 문법
        2. 보통 스택에 할당되므로 큰 크기를 쓰면 스택 오버플로우의 위험을 가짐
        3. 런타임 크기이므로 sizeof 결과는 컴파일타임 상수가 아님
        4. 이식성과 안정성 문제로 C++에서 사용하면 표준 위배됨
    4. 주요 활용 분야
      • 시스템을 제어하는 운영체제 개발
      • 특정 하드웨어에 최적화된 기능을 구현할 때 쓰이는 임베디드 시스템에 이용됨.
      • 하드웨어의 저수준 제어가 필요한 다양한 시스템 프로그래밍
  • C++언어
    1. C언어를 기반으로 객체 지향 프로그래밍(OOP) 개념을 추가하여 확장한 객체 지향 프로그래밍 언어이다.
    2. 특징
      • C언어의 확장판으로 C언어의 기본 문법, 데이터 타입, 포인터 등을 그대로 계승하여 사용함
      • 추상화, 상속, 다형성, 캡슐화와 같 객체 지향 프로그래밍의 주요 개념을 지원하여 복잡한 프로그램을 효율적으로 개발할 수 있도록 도움.
      • 객체 지향 외에대 절차 지향, 일반화 프로그래밍 등의 여러 프로그래밍 패러다임을 지원하는 범용 프로그래밍 언어임.
      • 하드웨어에 직접적인 접근이 가능하며, 실행 효율이 높아 성능이 중요한 분야에서 사용됨.
    3. 핵심 개념
      • OOP
      • RAII: 생성자/소멸자 기반의 자원관리
      • 템플릿/제네릭: 컴파일 타임 다형성, 표준 컨테이너/알고리즘(STL)과 결합됨.
      • 예외/RTTI/연산자 오버로딩/참조형 등의 풍푸한 기능이 있음
    4. 주요 활용 분야
      • 운영체제 커널, 시스템 유틸리티 등 하드웨어를 제어하는 시스템 프로그래밍에 사용됨
      • 높은 성능을 요구하는 게임 엔진 및 게임 클라이언트 개발에 널리 활용됨
      • 특정 하드웨어에 최적화된 기능을 구현하는데 적합하여 임베디드 시스템에 이용됨
  • 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++를 많이 쓰는 이유
    1. C++는 고수준 추상화를 쓰더라도 필요 없으면 비용이 발생하지 않는다는 철학을 가지기 때문에 컴파일 타임 최적화로 네이티브 C 수준 성능 확보가 쉬움
    2. 포인터/직렬화/정렬/캐시 지역성을 직접 다룰 수 있어 GPU, 렌더러, 물리엔진 같은 하드웨어 밀접 코드에 유리하기 때문
    3. RAII로 인한 결정적 자원관리: 소멸자가 자동으로 자원을 해제하므로, 리소스 정리 시점이 예측 가능함(GC가 없는 환경에서 매우 중요함)
    4. 대형 코드베이스 설계에 유리하고, 표준 라이브러리와 기존 엔진, 서드파티 툴체인이 C++ 중심으로 발달해있기 때문
    5. 수십 년간 쌓은 게임용 라이브러리, 툴, 엔진 코드베이스가 C++로 되어있음
    6. 런타임 오버헤드 회피: 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