250x250
반응형
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

재 현

C++ 가상 함수 (Virtual Functions) 이해하기 본문

C++

C++ 가상 함수 (Virtual Functions) 이해하기

본명은이점례 2023. 10. 6. 21:43
728x90

C++ 프로그래밍 언어에서 '가상 함수'는 객체 지향 프로그래밍의 중요한 개념 중 하나입니다. 가상 함수를 사용하면 다형성(polymorphism)을 구현하고 객체 지향 프로그래밍의 핵심 원칙 중 하나인 '상속'을 더 유연하게 활용할 수 있습니다. 이 블로그 글에서는 C++의 가상 함수에 대해 자세히 알아보겠습니다.

가상 함수란 무엇인가요?

가상 함수는 C++에서 클래스의 멤버 함수 중에서 '가상(virtual)' 키워드로 선언된 함수를 가리킵니다. 가상 함수는 파생 클래스(subclass)에서 재정의(override)될 수 있으며, 이를 통해 다형성을 구현할 수 있습니다. 다형성은 하나의 인터페이스를 가지고 다른 구현을 제공함으로써 코드 재사용성을 높이고 유지 보수를 쉽게 만들어줍니다.

class Shape {
public:
    virtual void draw() {
        // 기본 도형 그리기 로직
    }
};

class Circle : public Shape {
public:
    void draw() override {
        // 원 그리기 로직
    }
};

class Square : public Shape {
public:
    void draw() override {
        // 사각형 그리기 로직
    }
};

위의 예제에서 Shape 클래스의 draw 함수가 가상 함수로 선언되었습니다. 그리고 Circle 및 Square 클래스에서 이 함수를 재정의했습니다. 이렇게 가상 함수를 사용하면 다양한 파생 클래스에서 각자의 특별한 동작을 정의할 수 있습니다.

다형성과 가상 함수

가상 함수의 가장 큰 이점 중 하나는 다형성을 구현할 수 있다는 것입니다. 다형성은 동일한 인터페이스를 사용하여 서로 다른 객체 유형에 대해 작동할 수 있는 능력을 나타냅니다.

void drawShape(Shape* shape) {
    shape->draw(); // 다형성을 통해 올바른 draw 함수가 호출됨
}

int main() {
    Circle circle;
    Square square;

    drawShape(&circle); // 원 그리기 함수가 호출됨
    drawShape(&square); // 사각형 그리기 함수가 호출됨

    return 0;
}

위의 예제에서 drawShape 함수는 Shape 포인터를 매개변수로 받습니다. 이 함수는 다형성을 통해 Circle 또는 Square 객체를 전달할 수 있으며, 올바른 draw 함수가 호출됩니다.

가상 함수의 동작 원리

가상 함수의 동작 원리는 가상 함수 테이블(virtual function table, vtable)과 가상 함수 포인터(virtual function pointer)에 기반합니다. C++ 컴파일러는 각 클래스에 대한 가상 함수 테이블을 생성하고, 객체가 생성될 때 가상 함수 포인터를 테이블에 설정합니다. 이를 통해 올바른 가상 함수가 실행됩니다.

가상 소멸자

가상 함수뿐만 아니라 가상 소멸자(virtual destructor)도 중요한 개념입니다. 만약 베이스 클래스의 소멸자가 가상 함수로 선언되지 않으면 파생 클래스의 객체를 베이스 클래스 포인터로 삭제할 때 메모리 누수가 발생할 수 있습니다. 따라서 베이스 클래스의 소멸자는 가상 함수로 선언하는 것이 좋습니다.

class Base {
public:
    virtual ~Base() {
        // 소멸자 로직
    }
};

class Derived : public Base {
public:
    ~Derived() {
        // 파생 클래스 소멸자 로직
    }
};

결론

C++의 가상 함수는 객체 지향 프로그래밍의 핵심 요소 중 하나이며, 다형성을 통해 유연하고 확장 가능한 코드를 작성하는 데 도움을 줍니다. 가상 함수는 상속 관계에서 중요한 역할을 하며, 올바른 가상 함수 사용은 C++ 프로그래밍에서 필수적인 스킬 중 하나입니다. 가상 함수와 관련된 개념을 이해하면 더 나은 객체 지향 코드를 작성하는 데 도움이 될 것입니다.

728x90

'C++' 카테고리의 다른 글

스마트 포인터(smart pointer)  (0) 2023.07.31
C++의 메모리  (0) 2023.07.31