ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++]_11_overriding static
    c++ 2024. 11. 25. 15:53

    x와 y는 실행할 때 결정됨 overiding, dynamic binding

    이 코드는 C++로 작성된 프로그램으로, 정적 변수와 일반 변수의 차이를 이해할 수 있는 간단한 예제입니다. 아래에 코드와 함께 상세한 설명을 주석으로 추가했습니다.

    #include <iostream>  // 표준 입출력을 위한 헤더 파일
    using std::cout;      // std::cout을 cout으로 간단히 사용하기 위한 선언
    
    // 함수의 프로토타입 선언
    void sub();
    
    int main()
    {
        cout << "start\n";  // 프로그램 시작 메시지 출력
        sub();              // sub 함수 호출 (첫 번째 호출)
        sub();              // sub 함수 호출 (두 번째 호출)
        sub();              // sub 함수 호출 (세 번째 호출)
        return 0;           // 프로그램 정상 종료
    }
    
    // sub 함수 정의
    void sub()
    {
        int x = 10; // 지역 변수 x 선언 및 초기화
                    // 매번 함수가 호출될 때 새로운 x가 생성되고 10으로 초기화됨.
        
        static int y = 10; 
        // 정적 변수 y 선언 및 초기화
        // static 키워드를 사용하면 y는 프로그램의 생애 동안 한 번만 초기화됨.
        // 즉, 첫 번째 sub 호출 시 y가 10으로 초기화되고 이후 호출에서는 이전 값이 유지됨.
    
        cout << x << y << '\n'; 
        // x와 y의 값을 출력. x는 항상 10, y는 호출 횟수에 따라 증가.
    
        x++; // x의 값을 1 증가. 그러나 지역 변수이므로 호출이 끝나면 소멸.
        y++; // y의 값을 1 증가. 정적 변수이므로 값이 유지됨.
    }
    

    실행 결과

    프로그램 실행 시 결과는 다음과 같습니다:

    start
    1010
    1011
    1012
    

    결과 설명

    1. 첫 번째 호출 (sub()):
      • x = 10으로 초기화되고 출력. 호출 종료 시 소멸.
      • y = 10으로 초기화되고 출력. 이후 1 증가하여 y = 11.
    2. 두 번째 호출 (sub()):
      • x = 10으로 다시 초기화되고 출력. 호출 종료 시 소멸.
      • y = 11에서 유지된 상태로 출력. 이후 1 증가하여 y = 12.
    3. 세 번째 호출 (sub()):
      • x = 10으로 다시 초기화되고 출력. 호출 종료 시 소멸.
      • y = 12에서 유지된 상태로 출력. 이후 1 증가하여 y = 13.

    핵심 포인트

    • int x는 지역 변수로, 매번 함수 호출 시 새로 생성되고 함수가 종료되면 소멸합니다.
    • static int y는 정적 변수로, 프로그램 실행 중 한 번만 초기화되고 함수 호출 사이에 값을 유지합니다.

    이를 통해 정적 변수와 지역 변수의 동작 차이를 이해할 수 있습니다.

    이 코드는 C++에서 추상 클래스순수 가상 함수의 개념을 활용한 예제입니다. 아래에 코드와 주석을 추가하여 설명하겠습니다.


    #include <iostream>
    using std::cout;
    using std::endl;
    
    // 추상 클래스 정의
    class Shape {
    protected:
        double x, y; // 도형의 좌표 (필요 시 사용할 수 있는 보호된 멤버)
    public:
        // 순수 가상 함수: 하위 클래스에서 반드시 구현해야 함
        virtual double area() = 0; 
        // "virtual double area() = 0;"은 순수 가상 함수로 선언되어, Shape 클래스는 추상 클래스가 됨.
        // 추상 클래스는 객체를 생성할 수 없으며, 반드시 상속받은 클래스에서 가상 함수를 구현해야 함.
    };
    
    // 사각형 클래스 정의
    class Rectangle : public Shape {
    private:
        double height, width; // 사각형의 높이와 너비
    public:
        Rectangle(double h, double w) {
            height = h; // 높이 초기화
            width = w;  // 너비 초기화
        }
        // 사각형의 면적 계산: 가상 함수 area() 재정의 (override)
        double area() { 
            return (width * height); 
        }
    };
    
    // 삼각형 클래스 정의
    class Triangle : public Shape {
    private:
        double height, width; // 삼각형의 높이와 너비
    public:
        Triangle(double h, double w) {
            height = h; // 높이 초기화
            width = w;  // 너비 초기화
        }
        // 삼각형의 면적 계산: 가상 함수 area() 재정의 (override)
        double area() { 
            return (width * height / 2.0); 
        }
    };
    
    // 메인 함수
    int main() {
        // 추상 클래스 Shape는 순수 가상 함수를 포함하므로 객체를 생성할 수 없음
        Shape* p; // Shape 타입의 포인터 선언 (가능)
    
        // Rectangle 및 Triangle 클래스의 객체 생성
        Rectangle nemo(10.0, 20.0); // 높이 10, 너비 20인 사각형
        Triangle semo(10.0, 20.0);  // 높이 10, 너비 20인 삼각형
    
        // 부모 클래스 포인터가 자식 클래스 객체를 가리키는 다형성 사용
        p = &nemo; // p가 Rectangle 객체를 가리킴
        cout << "네모면적:" << p->area() << endl; 
        // Rectangle::area() 호출 → 출력: 200.0
    
        p = &semo; // p가 Triangle 객체를 가리킴
        cout << "세모면적:" << p->area() << endl; 
        // Triangle::area() 호출 → 출력: 100.0
    
        return 0;
    }
    

    코드 설명

    1. 추상 클래스와 순수 가상 함수:
      • Shape 클래스는 area()라는 순수 가상 함수를 정의하여 하위 클래스에서 면적 계산 방식을 구현하도록 강제합니다.
      • = 0이 붙은 함수는 순수 가상 함수이며, 이 때문에 Shape는 추상 클래스가 됩니다.
      • 추상 클래스는 객체를 직접 생성할 수 없지만, 포인터참조로 사용할 수 있습니다.
    2. 상속과 가상 함수 재정의:
      • Rectangle 클래스와 Triangle 클래스는 Shape 클래스를 상속받아 면적 계산을 위한 area() 함수를 각각 구현했습니다.
      • 다형성을 통해 부모 클래스 타입의 포인터 p로 자식 클래스의 객체를 가리킬 수 있습니다.
      • 자식 클래스의 area()가 부모 클래스의 area()를 **재정의(override)**하며, 가상 함수 테이블(vtable)을 사용해 올바른 함수를 호출합니다.
    3. 다형성:
      • 부모 클래스 포인터 p가 자식 클래스 객체를 가리킬 때, p->area()를 호출하면 올바른 자식 클래스의 area() 함수가 실행됩니다.

    실행 결과

    네모면적:200
    세모면적:100
    

    핵심 개념

    1. 추상 클래스(abstract class):
      • 하나 이상의 순수 가상 함수를 포함하는 클래스.
      • 객체를 생성할 수 없고, 반드시 하위 클래스에서 순수 가상 함수를 구현해야 함.
    2. 순수 가상 함수(pure virtual function):
      • 선언만 있고 정의가 없는 함수 (= 0으로 표기).
      • 상속받은 클래스에서 구현이 필요.
    3. 다형성(polymorphism):
      • 부모 클래스 타입의 포인터(또는 참조)를 통해 자식 클래스의 멤버 함수를 호출.
      • 실제 객체의 타입에 따라 적절한 함수가 호출됨.

    virtual은 부모에게 쓰고, draw()함수에 virtual를 쓴 건 자식의 함수를 먼저 사용.

     

Designed by Tistory.