Programming Language/C++ 37

[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을 기준으로 작성된 내용이므로 실제 컴파일러에서 코드를 돌리는 것과 동일하게 작동하지 않습니다. 이동 시맨틱에 대해서 배운다는 목적으로 아래 내용을 참조하면 되겠습니다.깊은 복사의 문제점을 해결하기 위해 얕은 복사를 사용객체를 복사할 때 하나 하나 많은 양의 값을 복사를 해야함.깊은 복사가 필요 없는 경우도 존재함// 고의적으로 얕은 복..

[C++] 대입 연산자 오버로딩

대입 연산자 오버로딩대입 연산자(=)는 객체에 다른 객체의 값을 할당하는 데 사용됨대입 연산자 오버로딩을 통해 자신이 정의한 클래스에 대해 대입 연산자의 동작을 사용자 지정하거나 확장함기본적으로 C++ 컴파일러는 멤버변수 단위로 얕은 복사(shallow copy)를 수행하지만, 깊은 복사(deep copy)를 수행하도록 지정할 수 있음/* 생략 */// 대입 연산자 오버로딩String &operator=(const String &rhs) { // 참조로 선언하지 않으면 rhs(s1)이라는 복사 생성자가 작동해서 복잡해짐. if (this != &rhs) { // 자기 자신을 대입하는 경우를 막기. // 만약 strData에 어떤 값이 존재한..

[C++] 복사 생성자 오버로딩

복사 생성자 오버로딩복사 생성자란 객체를 다른 객체로 복사하는 데 사용되는 특별한 생성자동일한 클래스의 다른 객체로부터 호출되며, 그 결과로 현재 객체가 다른 객체와 동일한 상태로 초기화됨/* 생략 */// 복사 !!!생성자!!!의 작동 String(const String &rhs) { // String s2(s1); 사용시 발생하는 일. // const String rhs 로 선언하면 안된다(무한 루프에 빠짐) cout String(const String &rhs) 에서 rhs가 아닌 &rhs를 사용해야 함레퍼런스로 선언하지 않으면 매개변수가 전달되는 과정에서 rhs(전달된 매개변수) 가 일어남이는 다시 복사 생성자를 호출하므로, 무한 루프에 빠지게 됨따라서 매개변수를 ..

[C++] 깊은 복사와 얕은 복사(Deep Copy, Shallow Copy)

깊은 복사와 얕은 복사(Deep Copy, Shallow Copy) 깊은 복사 / 얕은 복사란 얕은 복사 : 복사된 객체가 원본 객체의 요소들을 참조 예시 int *a = new int(5); int *b = new int(3); a = b; delete a; delete b; 3이 저장된 공간을 두 번 지움 5가 저장된 공간이 안지워짐 위와 같은 복사를 얕은 복사라 한다.(참조만 복사) 객체 내부에 참조 타입이 있는 경우에는 얕은 복사로 인해 문제가 발생할 수 있음 깊은 복사 : 원본 객체의 완전한 복사본을 생성, 복사된 객체는 완전히 독립적인 새로운 객체를 가지게 됨 내부에 있는 모든 객체들까지 재귀적으로 복사함 예시 int *a = new int(5); int *b = new int(3); *a =..

[C++] 동적할당

동적할당(Dynamic allocation) 동적할당(Dynamic allocation)이란 동적으로 할당되지 않은 변수의 경우 지역변수 : 지역변수가 속한 함수가 시작할 때 생성되고, 종료되면 소멸됨 전역변수 : 프로그램 시작과 동시에 생성되고, 종료되면 소멸됨 동적 할당 dynamic allocation : 프로그램 실행 중에 변수를 메모리에 할당하는 것 변수 동적할당 int main(void) { // int a = int(5); int *a = new int(5); // new 는 연산자. /* 작동원리: int(5)에서 메모리 상에 인트형을 저장하는 공간이 생겨나 5가 들어감(200번지). new가 이 공간의 주솟값(200번지)을 a에 넘겨줌. */ cout

[C++] 연산자 오버로딩

연산자 오버로딩 연산자 오버로딩이란? 프로그래밍 언어에서 기존에 정의된 연산자를 사용자가 직접 정의한 데이터 타입이나 클래스에 대해 재정의하는 것 메서드 이름 형식 : "(operator)(연산자)" 메서드 이름을 통해 함수를 직접 호출할 필요 없이 연산자 만으로 호출할 수 있다. 다른 클래스에 속하는 객체 간의 연산의 경우에도 가능하다 v1이라는 벡터가 있을 때, v1 * 1.6 은 멤버 연산자를 통해 연산자 오버로딩이 가능 v2이라는 벡터가 있을 때, 1.6 * v1 은 벡터 클래스에 속하지 않는 비멤버 연산자를 통해 연산자 오버로딩이 가능 ex) 벡터의 합을 구할 때 덧셈, 뺄셈, 나눗셈, 곱셈(스칼라)을 사용자가 직접 정의함 class Vector2 { public: // Vector2() : x..