C++ 61

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

C++ Call by Value와 Call by Reference의 차이

1. 함수의 호출 방식 2가지 함수는 값에 의한 호출 또는 참조에 의한 호출의 두 가지 방식으로 호출될 수 있다. 이 두 가지 방식은 일반적으로 매개변수로 전달되는 값의 유형에 따라 구분된다. 함수에 전달되는 매개 변수를 실제 매개 변수라고 하고, 함수에 의해 수신되는 매개 변수를 형식 매개 변수라고 한다. 2. Call by Value(값에 의한 호출) 매개변수 전달의 값 메서드에 의한 호출에서 실제 매개변수의 값은 함수의 형식 매개변수에 복사된다. 서로 다른 메모리 위치에 저장된 두 개의 매개변수 복사본이 있다. 하나는 original copy고 다른 하나는 function copy다. 함수 내부에서 변경된 내용은 발신자의 실제 매개변수에 반영되지 않는다. Call by Value 예시: // C p..

C++ 2024.04.01

C++ 매개변수 전달 총정리

1. 매개변수 전달의 개념 C++에서는 연산을 수행하기 위해 호출될 때 함수에 데이터를 보내야 한다. 이 데이터를 매개변수 또는 인수라고 하며, C++에서는 각각 장단점이 있는 다양한 매개변수 전달 방법이 있다. 그 다양한 방법에 대해 학습하는 시간을 갖는다. C++에 있는 함수에 매개변수를 전달하는 방법으로는 3가지가 존재한다. ① Value에 의한 전달 ② Reference에 의한 전달 ③ Pointer에 의한 전달 2. Pass by Value Pass by Value 방식에서는 변수의 실제 값을 복사한 다음 원래 변수 대신 함수에 전달한다. 따라서 함수 내부의 매개 변수를 변경해도 함수 외부의 변수의 원래 값에는 영향을 미치지 않는다. 이 방식은 상대적으로 이해하고 구현하기 쉽지만, 값을 복사하는..

C++ 2024.03.30
728x90