C++ 프로그래밍

C와 C++의 차이: 프로그래밍 언어의 발전

ROBL 2025. 2. 6.
728x90
반응형

C와 C++는 프로그래밍 언어의 역사에서 중요한 위치를 차지하고 있습니다. C는 1970년대 초반에 개발되어 시스템 프로그래밍과 임베디드 시스템에서 널리 사용되고 있으며, C++는 1980년대 초반에 C를 기반으로 객체지향 프로그래밍을 지원하기 위해 만들어졌습니다. 이 두 언어는 문법과 기능에서 많은 차이를 보이며, 이러한 차이는 개발자들이 선택하는 데 중요한 요소가 됩니다.

1. C 언어의 역사

C 언어는 1972년 데니스 리치(Dennis Ritchie)에 의해 벨 연구소에서 개발되었습니다. C는 B 언어를 기반으로 하여 만들어졌으며, 초기에는 유닉스 운영 체제를 개발하기 위해 설계되었습니다. C 언어는 그 당시 다른 언어들에 비해 효율성이식성이 뛰어나, 시스템 프로그래밍에 적합한 언어로 자리 잡았습니다. C는 절차적 프로그래밍 패러다임을 따르며, 함수와 구조체를 통해 프로그램을 구성합니다. 이러한 특성 덕분에 C는 다양한 운영 체제와 하드웨어에서 널리 사용되었고, 오늘날에도 여전히 많은 시스템에서 중요한 역할을 하고 있습니다.

2. C++ 언어의 역사

C++는 1983년 비야네 스트롭스트룹(Bjarne Stroustrup)에 의해 C 언어를 확장하여 객체지향 프로그래밍을 지원하기 위해 개발되었습니다. C++는 C의 강력한 성능을 유지하면서도, 객체지향 프로그래밍의 개념을 도입하여 코드의 재사용성과 유지보수성을 높였습니다. C++는 클래스, 상속, 다형성 등의 개념을 통해 복잡한 소프트웨어 시스템을 보다 쉽게 설계하고 구현할 수 있도록 합니다.

C++의 첫 번째 공식 표준은 1998년에 발표되었으며, 이후 C++11, C++14, C++17, C++20 등의 버전이 지속적으로 발전해왔습니다. 이러한 발전은 C++를 현대 소프트웨어 개발에 적합한 언어로 만들어 주었으며, 다양한 라이브러리와 프레임워크가 C++를 기반으로 개발되고 있습니다.

3. 프로그래밍 패러다임

  • C: 절차적 프로그래밍 언어로, 프로그램을 함수의 집합으로 구성합니다. 이는 코드의 흐름을 명확하게 하고, 각 함수가 특정 작업을 수행하도록 설계됩니다.
  • C++: 객체지향 프로그래밍을 지원하여, 데이터와 기능을 객체라는 단위로 묶어 관리할 수 있습니다. 이는 코드의 재사용성과 유지보수성을 크게 향상시킵니다.

4. 코드 예제

C에서의 간단한 함수는 다음과 같습니다:

#include <stdio.h>

void greet() {
    printf("Hello, World!\n");
}

int main() {
    greet();
    return 0;
}

위의 C 코드에서는 greet라는 함수를 정의하고 호출하여 "Hello, World!"를 출력합니다. 이처럼 C는 함수 중심의 구조로 되어 있습니다.

C++에서는 같은 기능을 객체지향적으로 구현할 수 있습니다:

#include <iostream>
using namespace std;

class Greeter {
public:
    void greet() {
        cout << "Hello, World!" << endl;
    }
};

int main() {
    Greeter greeter;
    greeter.greet();
    return 0;
}

C++ 코드에서는 Greeter라는 클래스를 정의하고, 그 안에 greet 메서드를 포함시켜 객체를 통해 호출합니다. 이처럼 C++는 클래스와 객체를 통해 더 구조화된 방식으로 코드를 작성할 수 있습니다.

5. 객체지향 프로그래밍

  • C: 구조체를 사용하여 데이터를 그룹화할 수 있습니다. 그러나 데이터와 관련된 기능은 별도의 함수로 구현해야 합니다.
  • C++: 클래스와 객체를 통해 데이터 은닉, 상속, 다형성과 같은 객체지향 프로그래밍의 핵심 원칙을 구현할 수 있습니다. 예를 들어, 상속을 통해 기존 클래스를 확장할 수 있습니다.
class Animal {
public:
    void speak() {
        cout << "Animal speaks" << endl;
    }
};

class Dog : public Animal {
public:
    void speak() {
        cout << "Dog barks" << endl;
    }
};

int main() {
    Dog dog;
    dog.speak(); // "Dog barks" 출력
    return 0;
}

위의 예제에서 Dog 클래스는 Animal 클래스를 상속받아 speak 메서드를 재정의합니다. 이는 다형성을 통해 다양한 객체가 동일한 인터페이스를 사용할 수 있게 합니다.

6. 메모리 관리

  • C: malloc()free() 함수를 사용하여 메모리를 수동으로 관리해야 합니다. 이는 메모리 누수와 같은 문제를 발생시킬 수 있습니다.
  • C++: newdelete 연산자를 통해 객체의 생성과 소멸을 자동으로 관리할 수 있습니다. 또한, 스마트 포인터를 사용하여 메모리 관리를 더욱 안전하게 할 수 있습니다.
#include <memory>

class MyClass {
public:
    MyClass() { cout << "Constructor" << endl; }
    ~MyClass() { cout << "Destructor" << endl; }
};

int main() {
    std::unique_ptr<MyClass> ptr(new MyClass());
    // ptr이 범위를 벗어나면 자동으로 메모리 해제
    return 0;
}

위의 코드에서 std::unique_ptr는 객체의 소멸자를 자동으로 호출하여 메모리를 해제합니다.

7. 예외 처리

  • C: 오류 처리를 위해 반환 값을 체크해야 합니다. 이는 코드의 가독성을 떨어뜨릴 수 있습니다.
  • C++: try, catch, throw 문을 사용하여 예외를 처리할 수 있습니다. 이는 코드의 가독성을 높이고, 오류 발생 시의 대처를 용이하게 만듭니다.
#include <iostream>
using namespace std;

void mayThrow() {
    throw runtime_error("An error occurred");
}

int main() {
    try {
        mayThrow();
    } catch (const exception& e) {
        cout << "Caught exception: " << e.what() << endl;
    }
    return 0;
}

위의 예제에서 mayThrow 함수는 예외를 발생시키고, main 함수에서 이를 처리합니다.

8. 결론

이처럼 C와 C++는 각각의 장단점이 있으며, 개발자는 프로젝트의 요구사항에 따라 적절한 언어를 선택해야 합니다. C는 시스템 프로그래밍과 임베디드 시스템에 적합하며, C++는 대규모 소프트웨어 개발과 객체지향 프로그래밍에 유리합니다. 다음 포스팅에서는 C++의 기본 문법에 대해 다루어 보겠습니다.

728x90
반응형

댓글

💲 추천 글