C++ 68

C++사용자 정의 예외

우리는 클래스에 예외 처리를 사용할 수도 있다. 심지어 사용자 정의 클래스 유형의 예외를 던질 수도 있다. try 블록 내에 demo 클래스 유형의 예외를 던지는 경우 작성할 수 있다. throw demo();단일 클래스로 예외 처리를 구현하는 프로그램 예시:#include  using namespace std; class demo { }; int main() {      try {           throw demo();      }      catch (demo d) {         cout "Caught exception of demo class \n";      } } 출력:Caught exception of demo class 위 프로그램에서는 빈 클래스를 선언했다. try 블록에서 우리는..

C++ 2024.04.25

C++ 스택 풀기(Stack Unwinding)

1. 스택 풀기의 개념Stack Unwinding은 실행 시간에 함수 호출 스택에서 함수 항목을 제거하는 프로세스다. 로컬 개체는 구성된 역순으로 파괴된다.스택 풀기는 일반적으로 예외 처리와 관련이 있다. C++에서 예외가 발생하면, 함수 호출 스택에서 예외 처리기를 선형으로 검색하고, 예외 처리기가 있는 함수 이전의 모든 항목을 함수 호출 스택에서 제거한다. 따라서 예외 처리는 동일한 함수(예외가 던져지는 곳)에서 예외를 처리하지 않으면, 스택 풀기를 포함하는 것이다. 기본적으로 스택 풀기는 런타임에 구성된 모든 자동 개체에 대해 (예외가 던져질 때마다) 파괴자를 호출하는 프로세스다.예시:// CPP Program to demonstrate Stack Unwinding  #include   usin..

C++ 2024.04.24

C++ 클래스를 이용한 예외 처리

이번 글에서 우리는 클래스를 이용한 예외 처리를 알아보도록 한다. Problem Statement① 데이터 멤버 a와 b를 갖는 클래스 Number를 만든다.② 반복 함수를 작성하여 두 숫자의 GCD(Greatest Common Divisor)를 찾는다.③ 주어진 수가 소수인지 아닌지 확인하기 위해 반복 함수를 작성한다. 만약 참이라고 판명나면, 클래스 MyPrimeException에 예외를 부여한다. ④ 자신만의 MyPrimeException 클래스를 정의한다. Solution① 두 개의 데이터 멤버가 있는 Number라는 이름의 클래스를 a와 b로 정의한다. ② 두 개의 멤버 함수를 다음과 같이 정의한다.   ⑴ int gcd(): 두 숫자의 HCF(Highest Common Factor)..

C++ 2024.04.24

C++ 예외 처리(Exception Handling) 총정리

1. 예외 처리(Exception Handling)의 개념 C++에서 '예외'는 프로그램이 실행하는 동안 발생하는 런타임 이상이나 비정상적인 상태다. 이러한 예외를 처리하는 과정을 예외 처리라고 한다. 예외 처리 메커니즘을 사용하면 예외가 발생한 프로그램의 한 부분의 제어를 코드의 다른 부분으로 전달할 수 있다. 2. 예외의 유형 예외에는 2가지 유형이 존재한다. ① 동기: 입력 데이터의 오류로 인해 문제가 발생하거나, 프로그램이 현재 작업 중인 데이터 유형을 처리할 수 있는 장비가 없을 때 발생하는 예외다. ex) 숫자를 0으로 나누는 것 ② 비동기: 디스크 고장, 키보드 인터럽트 등 프로그램이 통제할 수 없는 예외다. 3. 예외 처리를 위한 내장 기능 C++는 예외 처리를 위한 내장 기능을 제공한다...

C++ 2024.04.23

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++ 순수 가상 함수와 추상 클래스 총정리

1. 순수 가상 함수와 추상 클래스의 개념 기본 클래스에서는 모든 함수의 구현을 알 수 없기 때문에 모든 함수의 구현을 제공할 수 없는 경우가 있다. 이러한 클래스를 추상 클래스라고 한다. 예를 들어 Shape을 기본 클래스라고 하자. Shape에서 함수 draw()의 구현을 제공할 수는 없지만, 파생된 모든 클래스에는 draw()의 구현이 있어야 한다는 것을 알고 있다. 마찬가지로 Animal 클래스에는 move()의 구현이 없지만(모든 동물이 움직인다고 가정할 때), 모든 동물은 움직이는 방법을 알고 있어야 한다. 우리는 추상 클래스의 객체를 만들 수 없다. C++의 순수 가상 함수(또는 추상 함수)는 구현할 수 있는 가상 함수이지만, 파생 클래스에서 해당 함수를 재정의해야 하며, 그렇지 않으면 파생..

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
728x90