→ 우리에게 익숙한 예외처리는 if문을 이용한 예외처리임. 하지만 if문을 보고 예외처리를 위한 코드인지 프로그램의 흐름을 구성하는 코드인지 쉽게 구분하지 못해서 가독성이 떨어짐. C++의 예외처리 메커니즘을 이용하면 가독성을 높일 수가 있다. C++은 구조적으로 예외를 처리할 수 있는 메커니즘을 제공한다. 가독성과 유지보수성을 높일 수 있을 뿐만 아니라, 예외의 처리를 프로그램의 일반적인 흐름에서 독립시키는 것이 가능하다. Try Try 블록은 예외 발생에 대한 검사의 범위를 지정할 때 사용됨. 즉, try 블록 내에서 예외가 발생하면, C++의 예외처리 메커니즘에 의해서 처리가 된다. try { // 예외발생 예상지역 } try 블록을 묶는 기준은 예외가 발생할만한 영역을 묶는 것이 아니다! 예외가 ..
c++
순수 가상 함수 C++ 가상 함수(virtual function)는 파생 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미한다. 이와는 달리 순수 가상 함수(pure virtual function)란 파생 클래스에서 반드시 재정의해야 하는 멤버 함수를 의미한다. 따라서 파생 클래스에서 재정의하지 않으면 사용 불가능. 순수 가상 함수는 virtual 키워드와 함께 = 0으로 표시된다. → 즉 virtual 키워드만 있으면 가상 함수이고 =0이 같이 붙으면 순수 가상 함수라는 말임. class Base { public: virtual void pureVirtualFunction() const = 0; }; 추상 클래스 C++에서는 하나 이상의 순수 가상 함수를 포함하는 클래스를 추상 클래스(abstrac..
여기서는 깊은 복사에 대한 개념을 위주로 보기 보단 코드로 작성 예시를 보겠다 얕은 복사와 깊은 복사로 나뉘게 되는데 보통 우리는 얕은 복사를 사용하게 된다. 하지만 동적 할당을 한 후 얕은 복사를 하게 되면 우변에 동적 할당 된 친구를 그냥 가리키는 것 밖에 안 된다. 그래서 새롭게 동적 할당을 하여 복사를 해주는 것이 깊은 복사라고 생각하면 된다. Cat::Cat(Cat const &cat) { this->brain = nullptr; *this = cat; std::cout type = cat.getType(); if (this->brain) { delete this->brain; } this->brain = new Brain(*(cat.brain)); std::cout brain; } this->..
가상 함수란 가상함수는 부모 클래스에서 상속받을 클래스에서 재정의할 것으로 기대하고 정의해놓은 함수이다. virtual이라는 예악어를 함수 앞에 붙여서 생성할 수 있으며 이렇게 생성된 가상함수는 파생 클래스에서 재정의하면 이전에 정의되었던 내용들은 모두 새롭게 정의된 내용들로 교체된다. 이렇게 설명을 들으면 오버라이딩이랑 비슷하다고 생각할 수 있는데 아니다. 일단 가상 함수를 쓰는 이유는 업 캐스팅을 할 때 많이 사용하는 것으로 생각하면 될 것이다 업 캐스팅이란? 부모 클래스를 가리키는 포인터를 선언한 후 그 변수에 자식을 넣어주는 것이다. 코드를 보며 설명을 해보겠다. class Animal { int hp; inthunger; virtual ~Animal(); virtual getHP() return..
ex01을 하기전 상속에 대한 공부를 해보자 https://wo-dbs.tistory.com/147 C++ 상속 상속(inheritance)이란? “일정한 친족적 관계가 있는 사람 사이에 한 쪽이 사망하거나 법률상의 원인이 발생하였을 때 재산적 또는 친족적 권리와 의무를 계승하는 제도” 라고 네이버 사전에 정 wo-dbs.tistory.com 공부를 한 후 상속 오버라이딩 https://wo-dbs.tistory.com/148 C++ 상속 오버라이딩 현재 ScavTrap이 ClapTrap을 상속받은 상태 ScavTrap.hpp #ifndef SCAVTRAP_HPP # define SCAVTRAP_HPP # include # include "ClapTrap.hpp" class ScavTrap : publi..
ScavTrap.hpp #ifndef SCAVTRAP_HPP # define SCAVTRAP_HPP # include # include "ClapTrap.hpp" class ScavTrap : public ClapTrap { private: std::string name; unsigned int hitPoint; unsigned int energyPoint; unsigned int attackDamage; public: ScavTrap(); ~ScavTrap(); ScavTrap(std::string name); ScavTrap(const ScavTrap& scavTrap); ScavTrap& operator=(const ScavTrap& obj); void attack(const std::string&..
현재 ScavTrap이 ClapTrap을 상속받은 상태 ScavTrap.hpp #ifndef SCAVTRAP_HPP # define SCAVTRAP_HPP # include # include "ClapTrap.hpp" class ScavTrap : public ClapTrap { private: std::string name; unsigned int hitPoint; unsigned int energyPoint; unsigned int attackDamage; public: ScavTrap(); ~ScavTrap(); ScavTrap(std::string name); ScavTrap(const ScavTrap& scavTrap); ScavTrap& operator=(const ScavTrap& obj);..
상속(inheritance)이란? “일정한 친족적 관계가 있는 사람 사이에 한 쪽이 사망하거나 법률상의 원인이 발생하였을 때 재산적 또는 친족적 권리와 의무를 계승하는 제도” 라고 네이버 사전에 정의되어 있다. 부모님이 돌아가시면 부모님의 재산을 모두 물려받게 됨. 그런데 이 상속이 C++에서도 존재함. 예를 들어서 설명해보자. 사람이란 클래스, 학생이란 클래스가 있다고 가정 사람이란 클래스 내에는 이름, 나이, 취미 등과 같은 속성과 함께, 일어나기, 잠자기, 먹기, 공부하기 등 행동이 정의되어 있음. 학생이란 클래스 내에는 마찬가지로 이름, 나이, 취미, 소속, 학교와 같은 속성, 잠자기, 먹기, 공부하기 등과 같은 행동으로 정의되어 있음. 그런데, 학생도 역시 사람이란 부류에 속하므로 학생은 사람에..
이 문제는 비교, 산술, 증감 연산자를 오버로딩 해보는 문제이다. 연산자 오버로딩 → 간단하게 말해서 우리가 알고 있는 +, -, *, / 에서부터 ++, --, [], ==, =등 다양한 연산자들을 우리가 재정의해서 사용할 수 있게 해주는 방법. 아 근데 이 짓을 왜 해야되냐? 컴파일러는 우리가 만든 객체의 연산을 이애하지 못함. 우리가 객체를 만들고, 그 값들을 사용하는데 기본적인 연산자를 사용하지 못 하면 오바이긴 하니,, 우리가 만든 객체들의 연산자들의 정의를 우리가 직접 정의해서 객체끼리의 연산을 가능하도록 만든 거임. 연산자 오버로딩의 제한 → 오버로딩이 가능한 연산자가 있고 불가능한 연산자들이 있다. 이유는 기본적인 C++의 문법이 어긋날 수 있기 때문 Fixed.hpp #ifndef FIX..