2019/10/18
4C++ 가상 파괴자(virtual destructor)의 필요성
일반적으로 파괴자에서 처리해야 할 작업이 없으면 파괴자 정의 자체를 안 하는 경우가 많습니다. 할당한 걸 해제해줘야 하는 경우 파괴자를 정의하고 처리해줘야 하는 게 정상입니다. 가상 파괴자는 다음과 같은 상황일때 필요합니다. 기초, 파생 클래스에서 파괴자를 정의 한경우에 (필요로 할 때) 업 캐스팅될 여지가 있는 경우에 가상 파괴자가 아닐 때 #include using namespace std; class Person { public: ~Person() { cout
프로그래밍/C++ 2019.10.18 PlorenceC++ 다형(polymorhphic)과 가상 멤버 함수(virtual member function)
다형 파생 클래스에 대해 하는 행동이 기초 클래스에 대해 하는 행동과 다른 멤버 함수가 요구되는 상황이 있을 것입니다.(호출하는 객체에 따라 행동이 달라짐.) 즉 호출하는 객체에 따라 멤버 함수의 행동이 달라질 수 있습니다. 처한 상황에 따라 멤버 함수가 여러 가지 다른 행동을 할 수 있기 때문에, 여러 가지 형식을 가지고 있다는 의미에서 그러한 복잡한 행동을 다형이라고 부릅니다. 가상 멤버 함수(virtual method) 먼저 기초 클래스의 멤버 함수를 파생 클래스에서 재정의 하는 방법은 virtual 키워드를 사용하는 것입니다. 재정의할 때는 함수 시그니처가 동일해야 합니다. 간단한 예시를 들어보면 Person이라는 클래스를 정의하고 각각 Man, Girl이라는 클래스도 정의 후에 이 클래스는 Pe..
프로그래밍/C++ 2019.10.18 PlorenceC++ is-a 관계와 has-a 관계
is-a 관계 is-a 관계는 파생 클래스에 있어서 상속의 조건인데 is-a 관계의 의미인 ~은 ~이다라는 관계를 성립하자는 것입니다. public 상속을 사용할 때는 is-a관계가 성립되도록 만들어야 합니다. 예를 들어서 "사과는 과일이다"은 성립합니다. 사과는 과일이니까요. 틀린 예로 "과일은 사과이다."가 있겠습니다. 문장 그대로 과일이라는 단어는 사과를 의미하지 않으니까요. 그래서 Apple 클래스는 파생클래스로 Fruit 클래스를 상속할 수 있는 것입니다. is-a관계여야만 하는 이유 여러가지 과일의 대한 클래스를 만들 때, 기본적으로 그 사과들이 가지고 있는 공통적인 특징을 추상화한 클래스가 기초 클래스고 상속받은 여러가지 과일 클래스가 파생 클래스입니다. 이처럼 범위가 좁아지면서 기능이 기초..
프로그래밍/C++ 2019.10.18 PlorenceC++ 클래스 상속(class inheritance)
C++는 클래스를 확장하고 수정하기 위해 단순한 코드 수정보다 더 강력한 수단을 제공합니다. 바로 클래스 상속입니다. 기초 클래스(base class)라 부르는 클래스로부터 모든 멤버 함수와 멤버들을 상속받고 새로운 파생 클래스(clerived class)를 만들 수 있게 합니다. 상속으로 할 수 있는 일 기존의 클래스에 기능을 추가할 수 있습니다. 클래스가 나타내고 있는 데이터에 다른 것을 더 추가할 수 있습니다. 클래스 멤버 함수가 동작하는 방식을 변경할 수 있습니다. 상속의 의미 어떤클래스를 다른 클래스로부터 상속할 때, 오리지널 클래스를 기초 클래스(base class)라 하고 상속받는 클래스를 파생 클래스(derived class)라고 합니다. 위에서도 언급했지만 상속받게되면 멤버, 멤버 함수에..
프로그래밍/C++ 2019.10.18 Plorence