객체와 객체 배열의 동적 생성 및 반환
// 예제 4-7
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle(); // default constructor
Circle(int r); // constructor
~Circle(); // destructor
void setRadius(int r) { radius = r; } // Inline function
double getArea() { return 3.14 * radius * radius; } // Inline function
};
Circle::Circle() : radius(1) {}
Circle::Circle(int r)
{
radius = r;
cout << "생성자 실행 radius = " << radius << endl;
}
Circle::~Circle() { cout << "소멸자 실행" << endl; }
int main()
{
Circle* p, * q; // 포인터 객체 선언
p = new Circle; q = new Circle(30); // 동적 할당
cout << p->getArea() << endl << q->getArea() << endl;
delete p; delete q;
}
객체의 동적 생성 및 반환
- 동적 생성: 클래스 크기의 메모리를 할당받아 객체를 생성
<클래스이름> *<포인터변수> = new <클래스이름>; // 기본 생성자 호출
<클래스이름> *<포인터변수> = new <매개변수>; // 매개 변수 있는 생성자 호출
- 객체 반환: 동적으로 할당받은 객체 반환.
- 이때 <포인터변수>는 반드시 new를 이용해 동적 할당받은 메모리의 주소여야 한다.
- 객체를 반환하기 전에 객체 소멸자가 먼저 실행된다.
delete <포인터변수>
// 예제 4-9
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle(); // default constructor
Circle(int r); // constructor
~Circle(); // destructor
void setRadius(int r) { radius = r; } // Inline function
double getArea() { return 3.14 * radius * radius; } // Inline function
};
Circle::Circle() : radius(1) {}
Circle::Circle(int r)
{
radius = r;
cout << "생성자 실행 radius = " << radius << endl;
}
Circle::~Circle() { cout << "소멸자 실행 radius = " << radius << endl; }
int main()
{
int arraySize = 3;
Circle* pArray = new Circle[arraySize]; // 객체 배열의 동적 생성
for (int i = 0; i < arraySize; i++)
{
pArray[i].setRadius(10 * (i+1));
cout << pArray[i].getArea() << endl;
}
Circle* p = pArray; // 포인터 p에 배열의 주소값 저장
for (int i = 0; i < arraySize; i++)
{
cout << p->getArea() << endl;
p++; // 다음 주소
}
delete[] pArray; // 객체 배열 반환
}
객체 배열의 동적 생성 및 반환
- 동적 생성: 각 객체에 대해 기본 생성자를 호출한다. 이때 매개 변수 있는 생성자를 직접 호출할 수 없지만, 배열을 각 원소 객체로 초기화할 수 있다.
<클래스이름> *<포인터변수> = new <클래스이름> [배열 크기];
<클래스이름> *<포인터변수> =
new <클래스이름> [배열 크기] { <클래스이름>(매개변수), <클래스이름>(매개변수)};
// 매개변수 있는 생성자 호출 방법
- 객체 배열 반환: 소멸자의 실행 순서는 생성의 역순.
delete [] <포인터변수>;
- 객체 배열의 사용
- 동적으로 생성된 객체 배열은 보통 객체 배열처럼 사용한다.
힙(heap): 응용프로그램들이 실행 중에 할당받아 사용하는 시스템 메모리
- 동적으로 할당받은 메모리는 메모리 누수가 발생할 수 있으므로 필요 없을 때 힙에 반환하여 메모리 공간을 여유롭게 하는 것이 바람직하다.
- 메모리 누수(memory leak): 동적으로 할당받은 메모리의 주소를 잃어버려 힙에 반환할 수 없을 때 발생하는 것.
- new를 이용하여 할당받은 메모리는 프로그램이 종료할 때 자동으로 힙에 반환한다.
요약
동적 생성 및 객체 반환
1. 정의: 클래스 크기의 메모리를 할당받아 객체를 생성하는 것을 동적 생성이라 하고, 이를 해제하는 것을 객체 반환이라 한다.
2. 특징
a. C++의 경우 new와 delete 연산자를 이용해 이를 수행한다.
b. 객체 배열의 경우, 각 객체에 대한 기본 생성자를 호출한다. 이때 매개변수 있는 생성자를 직접 호출할 순 없다.
힙(Heap)
1. 정의: 응용 프로그램들이 실행 중에 할당받아 사용하는 시스템 메모리
2. 특징
a. 동적으로 할당받은 메모리는 메모리 누수(memory leak) 방지를 위해 필요 없을 땐 힙에 반환
b. new를 이용하여 할당받은 메모리는 프로그램이 종료할 때 자동으로 힙에 반환
this 포인터
this: 객체 자신에 대한 포인터 변수
- 객체의 멤버 함수가 호출될 때, 컴파일러에 의해 묵시적으로 삽입되어 보이지 않게 전달되는 객체에 대한 주소.
- this가 필요한 경우
- 멤버 변수의 이름과 동일한 이름으로 매개 변수 이름을 지을 때
- 객체의 멤버 함수에서 객체 자신의 주소를 반환할 때 (후에 연산자 중복을 구현할 때 자주 사용)
- 제약 사항
- 클래스의 멤버 함수에서만 사용 가능
- static 멤버 함수에서는 사용 불가능 (객체가 생성되기 전 호출될 수 있고, 실행되는 시점에서 현재 객체가 존재하지 아니할 수 있음)
요약
this
1. 정의: 객체 자신에 대한 포인터 변수로서, 객체에 대한 주소.
2. 특징
a. 컴파일러에 의해 묵시적으로 삽입되어 보이지 않게 전달
b. 멤버 변수의 이름과 동일한 이름으로 매개 변수를 짓거나 객체 자신의 주소를 반환할 때 사용
3. 제약사항
a. 클래스의 멤버 함수에서만 사용 가능
b. static 멤버 함수에서는 사용 불가능
string class를 이용한 문자열 사용
// 예제 4-11
#include <iostream>
#include <string> // string 클래스 사용
using namespace std;
int main()
{
string str; // 스트링 객체 생성
string address("서울시 성북구 삼선동 389");
string copyAddress(address); // address를 복사한 스트링 객체 생성
char text[] = { 'L', 'O', 'V', 'E', '\0' }; // c string
string title(text); // 문자 배열을 가진 스트링 객체 생성
cout << str << endl;
cout << address << endl;
cout << copyAddress << endl;
cout << title << endl;
}
string 객체 생성 및 출력
- 생성자를 이용해 다양한 문자열을 생성할 수 있다.
- 이때 cout 등을 이용해 화면에 출력할 수 있다.
- new / delete 연산자를 이용해 동적 생성 및 반환이 가능하다.
- 문자열의 크기에 맞추어 스스로 메모리를 조절한다.
생성자 | 설명 |
string() | 빈 문자열을 가진 스트링 객체 생성 |
string(string& str) | str을 복사한 새로운 스트링 객체 생성 |
string(char* s) | c-string s의 문자열을 복사해 스트링 객체 생성 |
string(char* s, int n) | 문자 배열 s에서 n개의 문자를 복사해 스트링 객체 생성 |
string 객체의 주요 멤버 함수
- append, insert, size, length, capacity, erase, clear, empty, at, find, rfind, compare, substr, swap ...
요약
string 클래스
1. 정의: C++에서 제공하는 문자열의 크기에 맞추어 스스로 메모리를 조절하는 문자열 클래스
2. 특징
a. 생성자를 이용해 다양한 문자열을 생성할 수 있음
b. new / delete 연산자를 이용한 동적 생성 및 반환이 가능
문제풀이: GitHub - maloveforme/Cpp
반응형
'Language > C++' 카테고리의 다른 글
[C++] CH5 함수와 참조, 복사 (2) (0) | 2023.03.02 |
---|---|
[C++] CH5 함수와 참조, 복사 (1) (0) | 2023.02.28 |
[C++] CH4 객체 포인터, 배열, 동적 할당 (1) (0) | 2023.01.31 |
[C++] CH3 클래스와 객체 (2) (0) | 2023.01.30 |
[C++] CH3 클래스와 객체 (1) (0) | 2023.01.28 |