전체 글 233

[C++] 상속에서의 형변환 - 업캐스팅(Upcasting)

상속에서의 형변환 - 업캐스팅(Upcasting)Based *b = new Derived;우리는 위와 같이 자식 클래스의 객체를 가리켜왔다. 이게 가능한 이유가 업 캐스팅(Upcasting) 때문이다.double a = 1이 가능한 이유는 double a = (double)1; 이라는 묵시적 변환이 이루어졌기 때문이다.int main() { Derived *d = new Derived; Base *b = d;}위와 같이 자식 클래스에서 부모 클래스로 올라가는 형태의 캐스팅을 업 캐스팅(Upcasting)이라고 한다Upcasting: 자식 클래스 포인터 -> 부모 클래스 포인터(묵시적)총각은 남자가 되도 문제가 없지만, 남자가 총각인 것은 아니다.그래서 자식 클래스 포인터(총각)를 부모 ..

[C++] 생성/소멸자 실행 순서와 가상 소멸자

생성/소멸자 실행 순서와 가상 소멸자상속 관계에서 생성자와 소멸자의 작동 과정에 대해 알아보자생성/소멸자 실행 순서#include using namespace std;class Ice { public: Ice() { cout 전에 말했던 것처럼 자식 클래스의 생성자가 호출 될 때 먼저 부모 클래스의 생성자가 호출된다PatBingsoo를 생성하면Pat, Bingsoo, Ice의 생성자가 모두 호출될 것이다소멸자도 마찬가지다.생성자와 소멸자의 순서를 예측해보자Ice() // PatBingsoo의 부모 클래스인 Bingsoo의 멤버인 ice가 제일 먼저 생성되었다.Bingsoo() // Bingsoo의 멤버 ice가 생성되고 Bingsoo가 생성되었다.Pat() // PatBingsoo의 멤버 pat..

[C++] 순수 가상 함수와 추상 클래스

순수 가상 함수(pure virtual function)와 추상 클래스(abstract class)이전 시간까지 가상 함수에 대해서 배웠다.아래 예시와 같이 가상 함수를 통해 오버라이딩을 할 수 있었다. #include using namespace std;class A { public: virtual void f() {}};class B : public A { public: void f() {}};int main() { A *a = new B; a->f(); delete a;}순수 가상 함수란 무엇인가요?가상이라는 것은 실제로는 존재하지 않는다는 의미인데, 이전 시간에서 다뤘듯 부모타입 포인터 변수가 부모타입 객체를 가리키면, 가상 함수 호출이 가능했다그래서 완..

[C++] 상속이 필요한 이유(2)

상속이 필요한 이유(2)상속이 필요한 이유(1) 코드#include #include using namespace std;class Message { public: Message(int sendTime, string sendName) { this->sendTime = sendTime; // this->sendTime을 안쓰고 sendTime을 쓰면 매개변수 값을 매개변수에 넣는 꼴. this->sendName = sendName; } int GetSendTime() const { return sendTime; } string GetSendName() const { return sendName; } private: int sendTime; s..

[C++] 가상 함수(Virtual Function)와 동적 바인딩(Dynamic Binding)

가상 함수(Virtual Function)와 동적 바인딩(Dynamic Binding)동적 바인딩 : 부모 클래스가 자식 클래스를 가리키고 있으면, 자식 클래스에 오버라이딩된 메서드를 실행할 수 있도록 동적으로 바인딩을 해준다.참고)동적 --> 런타임에 결정정적 --> 컴파일 타임에 결정Example) RPG 게임에서 무기 구현#include using namespace std;class Weapon { public: Weapon(int power) : power(power) { cout 자식 생성자가 호출되기 전에 반드시 부모 생성자가 호출된다mySword.Use()의 경우 Sword::Use()가 호출된다myMagic.Use()의 경우 Magic::Use()가 호출된다우리가 게임..

[C++] 오버라이딩(Overriding)과 정적 바인딩(Static Binding)

오버라이딩(Overriding)과 정적 바인딩(Static Binding)override : 우선하다overload: 다중 정의overwrite : 덮어 쓰다Overriding#include using namespace std;class Base { public: int a = 10; // Base() : a(10) {}이랑 똑같음. void Print() { cout int a = 10;생성자가 호출될 때, 멤버 변수 a를 10으로 초기화 된다class Derived : public Base { public: int a = 20; void Print() { cout 멤버 변수의 이름이 같다면, 자기 고유멤버가 상속멤버보다 우선순위가 높다.d에서 멤..

[C++] 상속이 필요한 이유(1)

상속이 필요한 이유(1)상속이 필요한 이유에 대해서 알아보자example) 메신저 프로그램텍스트, 이미지 등의 포맷을 갖는 데이터를 전송한다상속을 사용하지 않고 코드를 작성해보자// 상속을 사용하지 않은 코드#include #include using namespace std;class Image { public: operator string() { return "사진"; }};class TextMessage { public: TextMessage(int sendTime, string sendName, string text) { this->sendTime = sendTime; // this->sendTime을 안쓰고 sendTime을 쓰면 매개변수 값을 매..

[C++] 상속(Inheritance)과 접근제어(Access Control)

상속과 접근제어상속(Inheritance)부모가 자식에게 상속하면, 부모의 멤버들을 전부 사용하고, 자식만의 고유한 멤버를 추가로 가질 수 있다포함관계 : 부모가 자식을 포함하는 관계남자 ) 총각 이듯이 부모 ) 자식이다.자식이 부모한테 포함되는거고, 부모의 멤버가 자식의 멤버에 포함되는 것이다.#include using namespace std;class Base { public: void bFunc() { cout 자식 클래스(파생 클래스) 뒤에 콜론 ":"을 붙인 뒤 접근제어자와 부모 클래스를 적어준 뒤 선언하면 된다class Derived : public Base { // Base를 부모로 하는 클래스 public: void dFunc() { cout ..

[C++] Implicit Conversion(묵시적 형변환)

Implicit Conversion(묵시적 형변환)묵시적 형변환과 명시적 형변환묵시적(암시적) 형변환: implicit conversion형변환을 겉으로 드러내지 않음명시적 형변환: explicit conversion형변환을 명시한다변환 생성자#include #include using namespace std;class Item { public: Item(int num) : num(num) { // 변환 생성자 cout 이동생성자를 통해 i3로 대입 // 묵시적 변환 Item i4 = (Item)4; // Item(int num) 생성자가 형 변환까지 하고 있음. // 명시적 변환전부 Item(int num) 생성자를 호출우리가 알고 있는 일반적인 일반적인 생성..

[C++] 이동 시맨틱(Move Semantics): 이동 생성자, 이동 대입 연산자

이동 시맨틱(Move Semantics): 이동 생성자, 이동 대입 연산자필독아래에서 주의해서 봐야할 내용이 있습니다. C++17부터 Guarenteed Copy Elision(보장된 복사 생략)이라는 개념이 들어오면서 단순히 함수의 리턴값을 대입하는 경우 임시 객체를 만드는 과정을 생략합니다. 아래 예시에서도 단순히 함수의 리턴 값을 대입하고 있는데, 이 글은 C++11을 기준으로 작성된 내용이므로 실제 컴파일러에서 코드를 돌리는 것과 동일하게 작동하지 않습니다. 이동 시맨틱에 대해서 배운다는 목적으로 아래 내용을 참조하면 되겠습니다.깊은 복사의 문제점을 해결하기 위해 얕은 복사를 사용객체를 복사할 때 하나 하나 많은 양의 값을 복사를 해야함.깊은 복사가 필요 없는 경우도 존재함// 고의적으로 얕은 복..