-
[C++]_11_overriding staticc++ 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결과 설명
- 첫 번째 호출 (sub()):
- x = 10으로 초기화되고 출력. 호출 종료 시 소멸.
- y = 10으로 초기화되고 출력. 이후 1 증가하여 y = 11.
- 두 번째 호출 (sub()):
- x = 10으로 다시 초기화되고 출력. 호출 종료 시 소멸.
- y = 11에서 유지된 상태로 출력. 이후 1 증가하여 y = 12.
- 세 번째 호출 (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; }
코드 설명
- 추상 클래스와 순수 가상 함수:
- Shape 클래스는 area()라는 순수 가상 함수를 정의하여 하위 클래스에서 면적 계산 방식을 구현하도록 강제합니다.
- = 0이 붙은 함수는 순수 가상 함수이며, 이 때문에 Shape는 추상 클래스가 됩니다.
- 추상 클래스는 객체를 직접 생성할 수 없지만, 포인터나 참조로 사용할 수 있습니다.
- 상속과 가상 함수 재정의:
- Rectangle 클래스와 Triangle 클래스는 Shape 클래스를 상속받아 면적 계산을 위한 area() 함수를 각각 구현했습니다.
- 다형성을 통해 부모 클래스 타입의 포인터 p로 자식 클래스의 객체를 가리킬 수 있습니다.
- 자식 클래스의 area()가 부모 클래스의 area()를 **재정의(override)**하며, 가상 함수 테이블(vtable)을 사용해 올바른 함수를 호출합니다.
- 다형성:
- 부모 클래스 포인터 p가 자식 클래스 객체를 가리킬 때, p->area()를 호출하면 올바른 자식 클래스의 area() 함수가 실행됩니다.
실행 결과
네모면적:200 세모면적:100핵심 개념
- 추상 클래스(abstract class):
- 하나 이상의 순수 가상 함수를 포함하는 클래스.
- 객체를 생성할 수 없고, 반드시 하위 클래스에서 순수 가상 함수를 구현해야 함.
- 순수 가상 함수(pure virtual function):
- 선언만 있고 정의가 없는 함수 (= 0으로 표기).
- 상속받은 클래스에서 구현이 필요.
- 다형성(polymorphism):
- 부모 클래스 타입의 포인터(또는 참조)를 통해 자식 클래스의 멤버 함수를 호출.
- 실제 객체의 타입에 따라 적절한 함수가 호출됨.

virtual은 부모에게 쓰고, draw()함수에 virtual를 쓴 건 자식의 함수를 먼저 사용. 'c++' 카테고리의 다른 글
[C++]_12_(template STL 예외처리),(콘솔 파일 입출력) (0) 2024.12.02 [C++]_10_상속 (1) 2024.11.18 [C++]_09_(함수중첩 디폴트 인자) (0) 2024.11.11 [C++]_08_const, new (0) 2024.11.04 [C++_07_객체와 멤버, 배열, 생성자, 소멸자, this] (0) 2024.10.28 - 첫 번째 호출 (sub()):