1.2. 프로그램언어 C++( C plus plus)의 특징

프로그램언어 C++에서의 객체 지향 특성

프로그램언어 C++에서의 객체 지향 특성은 소프트웨어 개발에서 중요한 개념 중 하나입니다. 객체 지향 프로그래밍은 현실 세계의 사물을 모델링하여 프로그램을 구성하는 방법론으로, C++은 객체 지향 프로그래밍을 지원하는 언어 중 하나입니다.

객체 지향 프로그래밍의 주요 특성은 캡슐화, 상속, 다형성입니다. 캡슐화는 데이터와 해당 데이터를 처리하는 메서드를 하나의 단위로 묶는 것을 의미하며, 정보 은닉을 통해 객체의 내부 구현을 숨기고 외부에서 접근을 제어할 수 있습니다.

상속은 기존 클래스를 기반으로 새로운 클래스를 만들어 확장하는 개념으로, 코드의 재사용성을 높이고 유지보수를 용이하게 합니다. 다형성은 같은 이름의 메서드가 다른 동작을 할 수 있도록 하는 기능으로, 코드의 유연성을 높여줍니다.


#include <iostream>

// 부모 클래스
class Animal {
public:
    virtual void makeSound() {
        std::cout << "동물 소리" << std::endl;
    }
};

// 자식 클래스
class Dog : public Animal {
public:
    void makeSound() override {
        std::cout << "멍멍" << std::endl;
    }
};

int main() {
    Animal* animal = new Dog();
    animal->makeSound(); // 다형성을 통해 Dog 클래스의 makeSound() 호출
    delete animal;
    return 0;
}

위 예제 코드는 C++에서의 객체 지향 특성인 다형성을 보여줍니다. Animal 클래스를 부모 클래스로 정의하고, Dog 클래스를 Animal 클래스를 상속받아 makeSound() 메서드를 오버라이딩합니다. main 함수에서는 다형성을 이용하여 Dog 클래스의 makeSound() 메서드를 호출하는 예제입니다.

프로그램언어 C++에서의 메모리 관리

메모리 관리는 프로그램이 실행될 때 컴퓨터의 메모리를 효율적으로 활용하는 과정을 말합니다. C++에서는 개발자가 직접 메모리를 할당하고 해제해야 합니다. 메모리는 스택과 힙 두 가지 영역으로 나뉩니다. 스택은 지역 변수 및 함수 호출 시 사용되는 메모리를 저장하고, 힙은 동적으로 할당된 메모리를 저장합니다. 메모리 누수를 방지하기 위해 할당된 메모리는 반드시 해제되어야 합니다.

예를 들어, 다음은 동적으로 메모리를 할당하고 해제하는 예제 코드입니다.


#include 
using namespace std;

int main() {
    // 정수형 포인터를 선언하고 동적으로 메모리를 할당합니다
    int* numPtr = new int;
    
    // 할당된 메모리에 값 저장
    *numPtr = 10;
    
    // 메모리 사용
    
    // 메모리 해제
    delete numPtr;
    
    return 0;
}

프로그램언어 C++에서의 다중 상속 지원

다중 상속은 C++에서 한 클래스가 두 개 이상의 부모 클래스로부터 상속을 받는 것을 말합니다. 이는 객체 지향 프로그래밍에서 다양한 기능을 조합하여 클래스를 정의할 수 있는 강력한 기능입니다.

다중 상속을 사용하면 각 부모 클래스의 멤버 변수와 멤버 함수를 파생 클래스에서 모두 사용할 수 있습니다. 하지만 다중 상속은 다이아몬드 문제라고 불리는 상황을 발생시킬 수 있습니다. 이는 두 개 이상의 부모 클래스가 동일한 멤버를 가지고 있을 때 모호성이 발생하는 문제를 말합니다.

다음은 C++에서의 다중 상속을 사용한 간단한 예제 코드입니다.


#include <iostream>

// 부모 클래스 1
class Parent1 {
public:
    void display1() {
        std::cout << "Parent 1" << std::endl;
    }
};

// 부모 클래스 2
class Parent2 {
public:
    void display2() {
        std::cout << "Parent 2" << std::endl;
    }
};

// 다중 상속을 통한 파생 클래스
class Child : public Parent1, public Parent2 {
public:
    void display() {
        display1(); // Parent1의 멤버 함수 호출
        display2(); // Parent2의 멤버 함수 호출
    }
};

int main() {
    Child obj;
    obj.display(); // Child 클래스의 멤버 함수 호출
    return 0;
}

프로그램언어 C++에서의 오버로딩과 오버라이딩

오버로딩(Overloading)과 오버라이딩(Overriding)에 대한 설명

오버로딩(Overloading)은 C++에서 동일한 이름을 가진 함수가 매개변수의 개수나 타입에 따라 다르게 동작하는 것을 말합니다. 즉, 함수 이름은 같지만 매개변수의 형식이나 개수가 다르기 때문에 컴파일러는 어떤 함수를 호출해야 하는지 구별할 수 있습니다. 이는 함수 다중 정의라고도 불립니다.

오버라이딩(Overriding)은 상속 관계에서 발생하는 개념으로, 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것을 의미합니다. 즉, 부모 클래스의 메서드와 동일한 시그니처(이름, 매개변수, 반환형)를 가진 메서드를 자식 클래스에서 다시 정의하여 사용하는 것입니다.

오버로딩과 오버라이딩의 차이점

– 오버로딩은 같은 이름의 함수를 다양한 매개변수로 정의하는 것이며, 컴파일 시간에 결정됩니다.

– 오버라이딩은 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 다시 정의하는 것이며, 런타임 시간에 결정됩니다.

예제 코드


#include <iostream>

class Base {
public:
    void display() {
        std::cout << "Base 클래스의 display() 메서드" << std::endl;
    }
};

class Derived : public Base {
public:
    void display() {
        std::cout << "Derived 클래스의 display() 메서드" << std::endl;
    }
};

int main() {
    Base baseObj;
    Derived derivedObj;

    baseObj.display();    // Base 클래스의 display() 호출
    derivedObj.display(); // Derived 클래스의 display() 호출

    return 0;
}
    

프로그램언어 C++에서의 템플릿과 STL

프로그램언어 C++에서의 템플릿은 코드를 일반화하여 여러 자료형에 대해 동작할 수 있도록 하는 기능이다. 템플릿을 사용하면 함수나 클래스를 작성할 때 특정 자료형에 의존하지 않고 일반적인 형태로 작성할 수 있다. 이를 통해 코드의 재사용성을 높이고 유연성을 제공할 수 있다.

STL(Standard Template Library)은 C++ 표준 라이브러리로, 다양한 데이터 구조와 알고리즘을 제공한다. STL은 벡터, 리스트, 큐, 스택 등의 컨테이너와 정렬, 검색, 변환 등의 알고리즘을 포함하고 있어 개발자가 효율적으로 프로그램을 작성할 수 있도록 도와준다.

아래는 C++에서의 템플릿과 STL의 간단한 예제 코드이다.


#include 
#include 

// 템플릿을 사용한 함수
template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    int result1 = add(3, 5);
    std::cout << "Result 1: " << result1 << std::endl;

    double result2 = add(2.5, 3.7);
    std::cout << "Result 2: " << result2 << std::endl;

    // STL 벡터 활용
    std::vector<int> vec = {1, 2, 3, 4, 5};
    vec.push_back(6);

    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

Leave a Comment