[C++] 대입 연산자 오버로딩
·
Programming Language(Sub)/C++
대입 연산자 오버로딩대입 연산자(=)는 객체에 다른 객체의 값을 할당하는 데 사용됨대입 연산자 오버로딩을 통해 자신이 정의한 클래스에 대해 대입 연산자의 동작을 사용자 지정하거나 확장함기본적으로 C++ 컴파일러는 멤버변수 단위로 얕은 복사(shallow copy)를 수행하지만, 깊은 복사(deep copy)를 수행하도록 지정할 수 있음/* 생략 */// 대입 연산자 오버로딩String &operator=(const String &rhs) { // 참조로 선언하지 않으면 rhs(s1)이라는 복사 생성자가 작동해서 복잡해짐. if (this != &rhs) { // 자기 자신을 대입하는 경우를 막기. // 만약 strData에 어떤 값이 존재한..
[C++] 복사 생성자 오버로딩
·
Programming Language(Sub)/C++
복사 생성자 오버로딩복사 생성자란 객체를 다른 객체로 복사하는 데 사용되는 특별한 생성자동일한 클래스의 다른 객체로부터 호출되며, 그 결과로 현재 객체가 다른 객체와 동일한 상태로 초기화됨/* 생략 */// 복사 !!!생성자!!!의 작동 String(const String &rhs) { // String s2(s1); 사용시 발생하는 일. // const String rhs 로 선언하면 안된다(무한 루프에 빠짐) cout String(const String &rhs) 에서 rhs가 아닌 &rhs를 사용해야 함레퍼런스로 선언하지 않으면 매개변수가 전달되는 과정에서 rhs(전달된 매개변수) 가 일어남이는 다시 복사 생성자를 호출하므로, 무한 루프에 빠지게 됨따라서 매개변수를 ..
[C++] 깊은 복사와 얕은 복사(Deep Copy, Shallow Copy)
·
Programming Language(Sub)/C++
깊은 복사와 얕은 복사(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++] 동적할당
·
Programming Language(Sub)/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++] 연산자 오버로딩
·
Programming Language(Sub)/C++
연산자 오버로딩 연산자 오버로딩이란? 프로그래밍 언어에서 기존에 정의된 연산자를 사용자가 직접 정의한 데이터 타입이나 클래스에 대해 재정의하는 것 메서드 이름 형식 : "(operator)(연산자)" 메서드 이름을 통해 함수를 직접 호출할 필요 없이 연산자 만으로 호출할 수 있다. 다른 클래스에 속하는 객체 간의 연산의 경우에도 가능하다 v1이라는 벡터가 있을 때, v1 * 1.6 은 멤버 연산자를 통해 연산자 오버로딩이 가능 v2이라는 벡터가 있을 때, 1.6 * v1 은 벡터 클래스에 속하지 않는 비멤버 연산자를 통해 연산자 오버로딩이 가능 ex) 벡터의 합을 구할 때 덧셈, 뺄셈, 나눗셈, 곱셈(스칼라)을 사용자가 직접 정의함 class Vector2 { public: // Vector2() : x..
[C++] 멤버 메서드의 활용
·
Programming Language(Sub)/C++
멤버 메서드의 활용 멤버 메서드는 선언과 정의를 분리하는 것이 좋음 함수 내에서 다른 함수를 참조 하는 것처럼 멤버 메서드 내에서 다른 메서드를 참조할 수 있기 때문 #include using namespace std; class Vector2 { public: // Vector2() : x(0), y(0) {} Vector2(); // Vector2(float x, float y) : x(x), y(y) {} Vector2(float x, float y); // get함수는 const로 선언하는 것이 좋음 // float GetX() const { return x; } float GetX() const; // float GetY() const { return y; } float GetY() const;..
[C++] 상수형 매개변수와 상수형 메서드
·
Programming Language(Sub)/C++
상수형 매개변수와 상수형 메서드 const의 쓰임새 매개변수의 상수화 (모든 함수에서) 메서드의 상수화 (클래스에서 멤버 메서드) 실수 방지에 유용 ex) 은행 계좌 Class #include using namespace std; class Account { public: Account() : money(0) {} Account(int money) : money(money) {} void Deposit(const int d) { // 매개변수 d는 절대 변하면 안되기 때문에 const를 사용한다. // d = money; // 실수(버그) --> const를 사용해서 에러 호출 money += d; cout
[C++] 클래스(Class) (2) - 정적 멤버, 정적 메서드
·
Programming Language(Sub)/C++
클래스(Class) (2) - 정적 멤버 정적 멤버 정적 멤버 : 틀에 해당하는 멤버(붕어빵 틀) 동적 멤버 : 객체에 포함되는 멤버. 붕어빵마다 팥의 양이 조금씩 다른 것이 해당 ex) RGB 색상 정보를 저장하는 클래스 #include using namespace std; // 0~1 float R G B class Color { public: Color() : r(0), g(0), b(0) {} Color(float r, float g, float b) : r(r), g(g), b(b) {} float GetR() { return r; } float GetG() { return g; } float GetB() { return b; } private: float r; float g; float b; ..
[C++] 클래스(Class) (1)
·
Programming Language(Sub)/C++
클래스(Class) (1) 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀 자료를 저장하고 자료를 처리할 수 있음 특정한 용도를 수행하기 위한 변수와 함수를 모아 둔 틀 int a, b, c에서 int가 틀이라면 a, b, c 는 틀을 이용하여 찍어낸 변수(객체) 객체(오브젝트) : 틀을 이용하여 찍어낸 개체(변수, 메모리 상의 공간) 접근제어 지시자(access modifier) 객체지향 프로그래밍 언어에서 클래스의 멤버(필드, 메서드)에 대한 접근 권한을 제어하기 위해 사용되는 키워드나 지시자 래스의 내부 구조를 보호하고, 데이터 은닉(data encapsulation)을 지원하여 클래스의 캡슐화를 강화(캡슐화 : 외부에서 접근을 제한하고 내부의 상세 구현을 숨김) private / p..
[C++] 네임스페이스(namespace)
·
Programming Language(Sub)/C++
네임스페이스(namespace) 네임스페이스(namespace)는 프로그래밍에서 식별자(identifier)들의 범위를 나타내는 개념 변수, 함수, 클래스 등과 같은 여러 종류의 식별자들이 유일한 이름을 가지고 충돌하지 않도록 하는 데 사용 네임스페이스 프로토 타입 int n; // global variable void set(); // 프로토타입 namespace junseo { // 프로토타입 int n; void set(); } // namespace junseo namespace google { // 프로토타입 int n; void set(); } // namespace google 전역(global) 식별자와 네임스페이스에 속한 식별자 표기 void EX1(void) { ::set(); // g..