🧑🏻‍💻 Programming/C, C++

[C, C++] C 와 C++ 비교

koko1177 2025. 4. 5. 15:44
반응형

C vs C++ 비교

C vs C++ 비교

 

1. 언어의 핵심 및 특징

  • C 언어
    • 1972년 개발, 절차지향 언어
    • 저수준 시스템 제어에 강함
    • 시스템 프로그래밍, 운영체제, 임베디드 시스템 개발에 적합
    • 간결함, 효율성, 이식성, 저수준(메모리, 하드웨어 등) 직접 제어 가능
  • C++ 언어
    • C 기반 + 객체지향 언어의 확장 (1980년대 초)
    • 절차지향 + 객체지향 + 제네릭 프로그래밍 지원
    • C의 장점 계승+객체 지향 프로그래밍의 개념 도입 → 복잡한 구조의 소프트웨어 개발에 유리
    • 객체 지향, C와의 호환성, 풍부한 기능(라이브러리 및 기능), 높은 성능

2. 문법 및 출력 방식 비교

// C 코드
#include <stdio.h>

int main() {
    int num = 10;
    printf("C 언어: 숫자는 %d입니다.\n", num);
    return 0;
}
// C++ 코드
#include <iostream>

int main() {
    int num = 10;
    std::cout << "C++ 언어: 숫자는 " << num << "입니다." << std::endl;
    return 0;
}
  • C : printf(), scanf() 사용
  • C++ : iostream (cout, cin) 사용 | 네임스페이스(std::) 사용 (→ using namespace std;)

3. 객체지향 프로그래밍 지원 여부

  • C : 클래스 ❌, 구조체만 지원
  • C++ : 클래스, 상속, 다형성, 캡슐화 등 객체지향 핵심 지원
// C++ 클래스 예시
class Person {
public:
    std::string name;
    int age;

    void introduce() {
        std::cout << "안녕하세요, 제 이름은 " << name << "이고 나이는 " << age << "입니다." << std::endl;
    }
};

4. 메모리 관리 방식

  • C : malloc, free (직접 관리)
  • C++ : new, delete + 스마트 포인터(unique_ptr, shared_ptr)
// C 예시
int* ptr = (int*)malloc(sizeof(int));
*ptr = 10;
free(ptr);
// C++ 예시
int* ptr = new int;
*ptr = 10;
delete ptr;

5. 표준 라이브러리 및 자료구조 지원

  • C : 기본 유틸리티만 제공 (stdio.h, string.h 등)
  • C++ : STL (vector, map, list 등) + 알고리즘 제공
// C++ STL 벡터 예시
std::vector<int> v = {1, 2, 3};
v.push_back(4);
for (int n : v) std::cout << n << " ";

6. 예외 처리 (Exception Handling)

    • C : 예외 처리 기능 ❌ → 에러 코드를 수동으로 처리해야 함
    • C++ : try~catch, throw 구문을 이용한 예외 처리 지원
      • 예외 발생 시 throw로 예외를 던지고, try 블록에서 시도하며, catch로 처리함
        • try : 예외가 발생할 수 있는 코드를 감쌈
        • throw : 예외 발생 시 예외 던짐
        • catch : 발생한 예외를 받아 처리함
// try~catch, throw의 기본 형식

try {	// [예외 발생 영역]
    if (예외 조건) 
    	throw 예외 객체;	// [예외가 발생하면 예외를 던지는 영역]
} 
catch (예외 객체) {	// [던져진 예외를 잡는 영역]
	// [예외 처리 영역]
}
C++ 예외 처리 C 예외 처리 기능이 없어 아래와 같이 직접 조건 분기로 처리
// C++ 예외 처리 코드
// try~catch, throw 구문

#include <iostream>
 
using namespace std;
 
int divideFunc(int a, int b) {
if (b == 0) 
     throw invalid_argument("0으로 나눌 수 없음");
    return a / b;
}
 
int main()
{
    try {
     int result = divideFunc(10, 0);
        cout << "결과 : " << result << endl;
    } 
    catch (const exception& e) {
        cerr << "예외 발생: " << e.what() << endl;
        return -1;
}
    return 0;
}
// C 예외 처리 코드
// 예외 처리 기능이 없어 아래와 같이 직접 조건 분기로 처리

#include <stdio.h>

int divideFunc(int a, int b) {
    if (b == 0) {
        return -1;    // 오류 코드 반환
    }
    return a / b;
}

int main() {
    int result = divideFunc(10, 0);

    if (result == -1) {    // 직접 예외 처리
        printf("에러 : 0으로 나눌 수 없음.\n");
    } else {
        printf("결과 : %d\n", result);
    }
    return 0;
}

7. 템플릿 (Template)

  • C : 제네릭 기능 없음 → 타입별 함수 반복 작성 필요
  • C++ : 템플릿으로 자료형에 상관없는 함수/클래스 작성 가능
// C++ 템플릿 예시
template<typename T>
T add(T a, T b) {
    return a + b;
}

8. 성능 및 대표 사용 사례

  • 성능
    • C : 단순하고 오버헤드 적음 → 고성능, 시스템 프로그래밍, 임베디드 시스템, 하드웨어 제어 등에 적합
    • C++ : 구조가 복잡해 약간의 오버헤드 있음, 게임 개발, 고성능 애플리케이션, 복잡한 SW 개발
  • 대표 사용 사례
    • C : 리눅스 커널, 마이크로컨트롤러 ...
    • C++ : 게임 엔진, 데스크톱 앱, 금융 시스템 ...

9. 학습 난이도

  • C : 문법 단순, 메모리 관리 등 저수준 개념 필요
  • C++ : 기능 많고 문법 복잡 → 보다 높은 진입 장벽

💡 NOTE : 개인마다 편차가 존재할 수 있음.

 

반응형