C++ 63

C++에서 가상 함수(Virtual function)은 private이 가능할까?

가상 함수는 C++에 액세스 제어 기능이 있으므로 private 함수일 수는 있지만 가시성 제어 기능은 없다. 앞선 글에서 말한 바와 같이, 가상 함수는 파생 클래스에 의해 재정의될 수 있지만 모든 상황에서는 기본 클래스 내에서만 호출된다. 예시: // C++ program to demonstrate how a // virtual function can be private #include class base { public: // default base constructor base() { std::cout

C++ 2024.04.19

C++ RTTI(Run-Time Type Information) 총정리

1. RTTI의 개념 C++에서 RTTI(Run-time type information)는 런타임에 개체의 데이터 유형에 대한 정보를 노출하는 메커니즘으로, 하나 이상의 가상 기능을 가진 클래스에만 사용할 수 있다. 이를 통해 프로그램 실행 중에 객체의 유형을 결정할 수 있다. '런타임 캐스트' 라는 개념이 있는데, 이것은 캐스트가 유효한지 검사하는 것이다. 포인터나 참조를 사용하여 객체의 런타임 유형을 확인하는 가장 간단한 접근 방식이라 할 수 있다. 이는 기본 클래스에서 파생된 유형으로 포인터를 캐스팅해야 할 때 특히 유용하다. 클래스의 상속 계층 구조를 다룰 때 일반적으로 객체의 캐스팅이 필요하다. 이런 캐스트에는 두 가지 유형이 존재한다. ① 업캐스팅: 파생된 클래스 객체의 포인터 또는 참조를 기..

C++ 2024.04.19

C++ 정적 함수의 가상화 여부 총정리

1. 정적 함수의 가상화 가능성 C++에서 클래스의 정적 멤버 함수는 가상일 수 없다. 가상 함수는 클래스의 인스턴스에 대한 포인터 또는 참조가 있을 때 호출된다. 정적 함수는 클래스의 인스턴스에 연결되지는 않지만, 클래스에 연결된다. C++에는 포인터 대 클래스가 없으므로 정적 함수를 가상으로 호출할 수 있는 시나리오는 없다. 예를 들어, 아래 프로그램은 컴파일 오류가 나타난다: // CPP Program to demonstrate Virtual member functions // cannot be static #include using namespace std; class Test { public: virtual static void fun() {} }; 출력: prog.cpp:9:29: error:..

C++ 2024.04.15

C++ 순수 가상 소멸자(Pure Virtual Destructor) 총정리

1. 순수 가상 소멸자의 개념 우리는 C++에서 순수 가상 소멸자를 선언할 수 있다. 소멸자가 순수 가상 객체(클래스의 인스턴스)로 생성된 후, 소멸자의 바디가 제공된다. 이는 소멸자는 파생 클래스에서 재정의되지 않고 역순으로 호출되기 때문이다. 따라서 순수 가상 소멸자의 경우 소멸자 바디를 지정해야 한다. 기본 클래스 포인터 객체를 사용하여 파생 클래스의 인스턴스를 파괴할 때, 가상 소멸자를 사용하여 파생 클래스 객체 또는 인스턴스에 의해 할당된 메모리 공간을 확보한다. 참고로, 오직 '소멸자'만이 가상이 될 수 있다. '생성자'를 가상으로 선언할 수는 없다. 이는 생성자를 Base/Super 클래스에 선언하고, 동일한 기능을 가진 Derived/Sub 클래스에 호출하여 재정의하려고 하면 항상 오류가 ..

C++ 2024.04.12

C++ 가상 복사 생성자(Virtual Copy Constructor) 총정리

1. 가상 복사 생성자의 개념 이전 가상 생성자 글에서 런타임까지 유형이 결정되지 않는 객체를 생성하는 방법을 살펴봤다. 객체가 정확한 클래스 유형인지 알지 못한 채 생성하는 것이 가능할까? 여기서 등장하는 것이 바로 가상 복사 생성자다. 이것이 이 문제를 해결한다. 간혹 우리는 기존의 다른 객체로부터 객체를 구성해야 할 필요가 있을 수 있다. 그리고 엄밀히 말하면, 복사 생성자가 같은 일을 한다. 새로운 객체의 초기 상태는 기존의 다른 객체 상태를 기반으로 한다. 컴파일러는 객체가 다른 객체로부터 인스턴스화될 때 복사 생성자를 호출한다. 그러나 컴파일러는 적절한 복사 생성자를 호출하기 위해 구체적인 유형 정보가 필요하다. 예시: #include using namespace std; class Base ..

C++ 2024.04.09

C++ 가상 생성자(Virtual Constructor) 총정리

1. 가상 생성자의 개념클래스 생성자를 C++로 가상화하여 다형성 객체를 생성할 수 있을까? Nope. C++는 정적으로 입력된 언어이기 때문에 C++ 컴파일러는 객체를 다형성으로 생성하는 것이 무의미하다. 컴파일러는 객체를 생성하기 위해 클래스 유형을 알고 있어야 한다. 즉, 어떤 유형의 객체를 생성할 것인지는 C++ 컴파일러 관점에서 컴파일 타임 결정이다. 만약 생성자를 가상화한다면 컴파일러는 오류를 플래그로 지정한다. 실제로 생성자 선언문에는 인라인을 제외하고는 다른 키워드가 허용되지 않는다. 실제 시나리오에서, 어떤 입력을 기반으로 클래스 계층 구조에서 파생된 클래스 객체를 생성해야 한다. 즉, 객체 생성과 객체 유형은 긴밀하게 연결되어 있기 때문에 수정 사항을 확장해야 하는 것이다. 가상 생성자..

C++ 2024.04.08

C++ 가상 소멸자(Virtual Destructor) 총정리

1. 가상 소멸자의 개념 가상 소멸자가 아닌 기본 클래스 유형의 포인터를 사용하여 파생 클래스의 객체를 삭제하면, 정의되지 않은 동작이 발생한다. 이 상황을 수정하려면 기본 클래스를 가상 소멸자로 정의해야 한다. 즉, 객체의 소멸과정에서는 포인터 변수의 자료형에 상관없이 모든 소멸자가 호출되어야 하는데, 그 해결책이 가상 소멸자라는 것이다. 예를 들어, 아래 프로그램은 정의되지 않은 동작을 발생시킨다: // CPP program without virtual destructor // causing undefined behavior #include using namespace std; class base { public: base() { cout

C++ 2024.04.08

C++ 인라인(Inline) 함수 총정리

1. 인라인 함수의 개념 C++는 함수 호출 오버헤드를 줄이기 위해 인라인 함수를 제공한다. 인라인 함수는 호출될 때 일렬로 확장되는 함수다. 인라인 함수가 호출되면, 인라인 함수 호출 지점에 인라인 함수의 전체 코드가 삽입되거나 치환된다. 이 치환은 컴파일 시 C++ 컴파일러에 의해 수행된다. 인라인 함수는 그 크기가 작으면, 효율성을 높일 수 있다. 구문: inline return-type function-name(parameters) { // function code } 단, 인라이닝은 컴파일러에 대한 요청일 뿐, 명령어가 아님을 명심하자. 컴파일러는 인라이닝 요청을 무시할 수 있다. 컴파일러는 다음과 같은 상황에서는 인라인을 수행할 수 없다. ① 함수에 루프가 포함된 경우(for, while, d..

C++ 2024.04.04

C++ 재귀(Recursion) 총정리

1. 재귀(Recursion)함수의 개념 C++에서의 재귀는 주어진 조건이 만족될 때까지 함수가 반복적으로 자신을 호출하는 기술이다. 즉, 재귀는 문제를 더 작고 간단한 하위 문제로 분해하여 해결하는 과정이라 할 수 있다. 우리의 노가다 같은 수고를 덜어주는 기술인 것이다. 구문: return_type recursive_func { .... // Base Condition // Recursive Case .... } 이제 여기서, 자기 자신을 호출하는 함수를 재귀 함수라고 한다. 재귀 함수가 호출되면 명령어 집합을 실행한 다음, 자기 자신을 호출하여 더 작은 입력으로 동일한 명령어 집합을 실행한다. 이 과정은 재귀를 멈추고 값을 반환하는 조건인 베이스 케이스에 도달할 때까지 계속된다. 기저 조건(Base..

C++ 2024.04.03

C++ 디폴트 인수(Default Arguments) 총정리

1. 디폴트 인수의 개념 디폴트 인수는 함수 선언에서 제공되는 값으로, 호출 함수가 인수에 대한 값을 제공하지 않으면 컴파일러가 자동으로 할당한다. 이때 어떤 값이 전달되면 디폴트 값은 덮어쓴다. 예시를 통해 확인해 본다. 여기서 우리는 3개의 합 함수를 쓸 필요가 없다. 3번째 인수와 4번째 인수의 디폴트 값을 사용하면 하나의 함수만 작동한다. // CPP Program to demonstrate Default Arguments #include using namespace std; // A function with default arguments, // it can be called with // 2 arguments or 3 arguments or 4 arguments. int sum(int x, i..

C++ 2024.04.02
728x90