목록c++ (35)
Brise
객체지향에서 인스턴스화 시킬 수 없는 클래스를 추상클래스라 한다. C++언어에서는 추상클래스를 함수의 값을 NULL(아마도 C언어에서 함수포인터를 NULL로 하는 것과 같은 듯 하다.)로 지정하는 것으로 추상 함수를 만들고, 추상함수를 가지고 있는 객체를 추상클래스로 지정한다. C++에서는 보통 인터페이스를 구현하고자 할 때 추상클래스를 이용하여, 인터페이스를 구현한 객체가 해당 인터페이스를 필수로 구현하도록 컴파일러 단계에서 강제하는 방식을 주로 사용한다. // 2_추상클래스 168 page #include // 추상 클래스 : 순수 가상함수가 한개 이상 있는 클래스 // 특징 : 객체를 만들수 없다. // 의도 : 특정 함수의 구현부를 제공하라고 지시 하는 문법. class Shape { public..
대부분의 C++ 프로그램에서는 객체를 핸들링하기 위해서 객체 포인터를 주로 사용하며, 파생클래스와 기반클래스 객체들을 일괄로 다루기 위해 기반클래스 포인터를 사용한다. 만약, 기반클래스 포인터를 이용하여 객체를 핸들링할 때, 객체의 소멸자가 가상함수가 아니라면 파생클래스를 소멸시킬 때 기반클래스의 포인터를 이용하여 소멸시키기 때문에 기반클래스의 소멸자가 불려 비정상적으로 객체를 소멸시키게 된다. 때문에 클래스의 소멸자는 가상함수(virtual function)이어야만 한다. // 1_가상소멸자 149 page #include // 핵심 : 모든 기반 클래스의 소멸자는 반드시 가상함수 이어야 한다. class Base { public: virtual ~Base() {} // 기반 클래스의 소멸자가 가상이면..
C++ 은 C가 아니다. C++와 C는 거의 호환되는 것처럼 보이지만, 실제로는 다르게 동작하고 있다. C++에서는 C에서 지원하지 않는 다형성과 같은 특징을 지원하고 있으며, 이를 위해서 mangling이라는 구조를 도입하여 여러 함수들과의 충돌을 방지하고 있다. mangling 방법은 컴파일러별로 상이하다. // 9_mangling // C 로 컴파일 하면 : 함수이름 Add(gcc), _Add(vc) // C++로 컴파일 하면 : ?Add@XXYYH@Z(VC++), ??(g++) // name mangling : C++ 컴파일러가 함수이름을 변경하는 것 // => 함수 오버로딩 때문에 Add 함수가 여러개 일수 있으므로 int Add(int a, int b) { return a + b; } int ..
C++의 다형성과 같은 특징들은 컴파일 시간에 호출할 함수가 정해진다는 특성이 있다. 만약 여러 클래스에 대해서 같은 함수를 만들고, 기반 클래스의 함수 포인터를 이용하여 핸들링하게 되는 경우 기반 클래스에 있는 함수를 호출하게 된다.(컴파일 시간에 기반 클래스의 함수로 바인딩 되기 때문에) 기반 클래스의 함수를 호출하면서 동작은 실제 클래스별로 다르게 동작시키고 싶은 경우 함수 호출에 따라 실제 사용할 함수를 동적으로 결정하여야 하며, 이 때 가상함수(virtual function) 을 사용하여야 한다. // 7_가상함수1 144 page ~ #include class Animal { public: virtual void Cry() { std::cout Cry() 를 어떤 함수로 연결할것인가 ? // ..
파생클래스 포인터를 기반클래스 포인터로 캐스팅하여 사용하는 것을 업캐스팅이라 한다. 업캐스팅을 이용하면 여러 종류의 클래스를 하나의 코드로 운용 가능하다는 장점이 있다. // 6_Upcasting1.cpp 140 page ~ #include class Animal { public: int age; }; class Dog : public Animal { public: int color; }; int main() { Dog dog; Dog* p1 = &dog; // ok Animal* p2 = &dog; // ok. 파생클래스의 주소를 // 기반 클래스 타입의 포인터에 담을수있다 //p2->color = 10; // error. Animal* 로는 Animal의 멤버만 // 접근 가능하다. static_ca..
상속은 객체지향언어에서 가장 중요한 개념중에 하나이다. 상속을 통하여 코드 재활용성의 가능성을 높일 수 있다. C++에서는 상속을 위하여 클래스 뒤에 상속받는 클래스의 이름을 콜론(:)으로 분리하여 명시한다. // 5_상속1.cpp 132page ~ #include #include class People { std::string name; int age; }; class Student : public People // 상속 ( inheritance ) { int id; }; class Professor : public People { int major; }; int main() { } private 지시어로 붙은 멤버 변수의 경우 파생 클래스에서도 접근이 불가능하다. // 5_상속2 class Base ..
상수멤버함수는 실행시 모든 멤버 값들을 상수로 취급하는 함수이다. 잘 생각해보면 c언어에서 const struct 가 있듯이 c++언어에서는 const class가 있으며, 거기에다가 객체 지향 언어이므로 const class에서 사용할 수 있는 함수가 있어야 한다. // 4_상수멤버함수1.cpp 119 page ~ #include class Point { public: int x, y; Point(int a = 0, int b = 0) : x(a), y(b) {} void set(int a, int b) { x = a; y = b; } void print() const // 상수 멤버 함수 { // 상수 멤버 함수 안에서는 모든 멤버를 상수 취급 합니다 // x = 100; // error std::c..
220404~220407 C++ Design pattern 교육 C++ 언어 내용 요약 Public : 기반 클래스, 파생 클래스, 외부에 모두 공개 protected : 기반 클래스, 파생 클래스에 공개 생성자를 protected에 놓는 경우: 추상적인 개념을 모델링 할 때 생성자를 직접 호출 불가능하게 만들고 파생되는 실체 클래스가 생성자를 호출할 수 있도록 하기 위함. (Abstract class) private : 기반 클래스에게만 공개 upcasting: 객체지향 언어 특성 상 파생클래스의 포인터를 기반 클래스의 객체로 캐스팅할 수 있다. (파생클래스는 기반클래스에서 정의하는 모든 기능을 지원함) 단, 기반클래스 형태일 때 파생클래스에서 정의한 고유 멤버에 접근이 불가능하며 파생클래스에서 정의하..