๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[๊ฐ์ฒด ํฌ์ธํฐ์ ๊ฐ์ฒด ๋ฐฐ์ด, ๊ฐ์ฒด์ ๋์ ์์ฑ] ๊ฐ์ฒด ํฌ์ธํฐ์ new delete ๋์ ์์ฑ ๋ฐ ํ ๋น๊ณผ ๋ฐํ ๋ณธ๋ฌธ
[๊ฐ์ฒด ํฌ์ธํฐ์ ๊ฐ์ฒด ๋ฐฐ์ด, ๊ฐ์ฒด์ ๋์ ์์ฑ] ๊ฐ์ฒด ํฌ์ธํฐ์ new delete ๋์ ์์ฑ ๋ฐ ํ ๋น๊ณผ ๋ฐํ
์ง์ง์ํ์นด 2024. 2. 21. 01:03<ํฉ๊ธฐํ ๋์ ๋ช ํ C++ Programming ์์ ์ ์ฐธ๊ณ ํด์ ์์ฑํ์์ต๋๋ค :-)>
๐ ๊ฐ์ฒด ํฌ์ธํฐ ์ ์ธ ๋ฐ ํ์ฉ
โ๏ธ ๊ฐ์ฒด ํฌ์ธํฐ
๊ฐ์ฒด์ ๋ฉค๋ฒ ํจ์๋ฅผ ์ฝ๊ณ ๊ฐ์ ์ฐ๊ฑฐ๋ ๋ฉค๋ฒ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค
โ๏ธ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ ๋ณ์ ์ ์ธ
Circle *p;
โ๏ธํฌ์ธํฐ ๋ณ์์ ๊ฐ์ฒด ์ฃผ์ ์ง์
๊ฐ์ฒด์ ์ฃผ์๋ ๊ฐ์ฒด ์ด๋ฆ ์์ & ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํํํ๋ค
p = &donut;
โ๏ธํฌ์ธํฐ๋ฅผ ์ด์ฉํ ๊ฐ์ฒด ๋ฉค๋ฒ ์ ๊ทผ
๊ฐ์ฒด ์ด๋ฆ์ผ๋ก ๋ฉค๋ฒ๋ฅผ ์ ๊ทผํ ๋ ์ (.) ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค
d = donut.getArea();
๊ฐ์ฒด ํฌ์ธํฐ๋ก ๋ฉค๋ฒ๋ฅผ ์ ๊ทผํ ๋ -> ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค
d = p -> getArea();
d = (*p).getArea();
// ๊ฐ์ฒด ํฌ์ธํฐ ์ ์ธ ๋ฐ ํ์ฉ
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
double getArea();
};
double Circle::getArea()
{
return 3.14 * radius * radius;
}
int main()
{
Circle donut;
Circle pizza(30);
// ๊ฐ์ฒด ์ด๋ฆ์ผ๋ก ๋ฉค๋ฒ ์ ๊ทผ
cout << donut.getArea() << endl;
// ๊ฐ์ฒด ํฌ์ธํฐ๋ก ๋ฉค๋ฒ ์ ๊ทผ
Circle *p;
p = &donut;
cout << p->getArea() << endl;
cout << (*p).getArea() << endl;
p = &pizza;
cout << p->getArea() << endl;
cout << (*p).getArea() << endl;
}
/*
3.14
3.14
3.14
2826
2826
- ๊ฐ์ฒด ํฌ์ธํฐ
๊ฐ์ฒด์ ๋ฉค๋ฒ ํจ์๋ฅผ ์ฝ๊ณ ๊ฐ์ ์ฐ๊ฑฐ๋ ๋ฉค๋ฒ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค
- ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ ๋ณ์ ์ ์ธ
Circle *p;
- ํฌ์ธํฐ ๋ณ์์ ๊ฐ์ฒด ์ฃผ์ ์ง์
๊ฐ์ฒด์ ์ฃผ์๋ ๊ฐ์ฒด ์ด๋ฆ ์์ & ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํํํ๋ค
p = &donut;
- ํฌ์ธํฐ๋ฅผ ์ด์ฉํ ๊ฐ์ฒด ๋ฉค๋ฒ ์ ๊ทผ
๊ฐ์ฒด ์ด๋ฆ์ผ๋ก ๋ฉค๋ฒ๋ฅผ ์ ๊ทผํ ๋ ์ (.) ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค
d = donut.getArea();
๊ฐ์ฒด ํฌ์ธํฐ๋ก ๋ฉค๋ฒ๋ฅผ ์ ๊ทผํ ๋ -> ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค
d = p -> getArea();
d = (*p).getArea();
*/
๐ ๊ฐ์ฒด ๋ฐฐ์ด
๊ฐ์ฒด ๋ฐฐ์ด์ ์์๊ฐ ๊ฐ์ฒด
int, char ๋ฑ ๊ธฐ๋ณธ ํ์
์ ๋ฐฐ์ด์ ์ ์ธํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ
// Circle ํด๋์ค์ ๋ฐฐ์ด ์ ์ธ ๋ฐ ํ์ฉ
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
void setRadius(int r) { radius = r; }
double getArea();
};
double Circle::getArea()
{
return 3.14 * radius * radius;
}
int main()
{
// Circle ๊ฐ์ฒด ๋ฐฐ์ด ์์ฑ
Circle circleArray[3];
// ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด์ ๋ฉค๋ฒ ์ ๊ทผ
circleArray[0].setRadius(10);
circleArray[1].setRadius(20);
circleArray[2].setRadius(30);
// ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด์ ๋ฉค๋ฒ ์ ๊ทผ
for (int i = 0; i < 3; i++)
{
cout << "Circle " << i << "์ ๋ฉด์ ์ " << circleArray[i].getArea() << endl;
}
Circle *p;
p = circleArray;
// ๊ฐ์ฒด ํฌ์ธํฐ๋ก ๋ฐฐ์ด ์ ๊ทผ
for (int i = 0; i < 3; i++)
{
cout << "Circle " << i << "์ ๋ฉด์ ์ " << p->getArea() << endl;
// ๋ฐฐ์ด์ ๋ค์ ์์
p++;
}
}
/*
Circle 0์ ๋ฉด์ ์ 314
Circle 1์ ๋ฉด์ ์ 1256
Circle 2์ ๋ฉด์ ์ 2826
Circle 0์ ๋ฉด์ ์ 314
Circle 1์ ๋ฉด์ ์ 1256
Circle 2์ ๋ฉด์ ์ 2826
- ๊ฐ์ฒด ๋ฐฐ์ด
๊ฐ์ฒด ๋ฐฐ์ด์ ์์๊ฐ ๊ฐ์ฒด
int, char ๋ฑ ๊ธฐ๋ณธ ํ์
์ ๋ฐฐ์ด์ ์ ์ธํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ
*/
๐ ๊ฐ์ฒด ๋ฐฐ์ด ์ด๊ธฐํ
โ๏ธ ๊ฐ์ฒด ๋ฐฐ์ด ์ ์ธ
๊ฐ์ฒด ๋ฐฐ์ด ์ ์ธ๋ฌธ์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ๋ค
์ค์ง ๋งค๊ฐ ๋ณ์ ์๋ ๊ธฐ๋ณธ ์์ฑ์ ํธ์ถํ๋ค
์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ฝ์
ํ๋ฏ๋ก, ๊ฐ์ฒด ๋ฐฐ์ด ์์ฑ ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค
๋งค๊ฐ ๋ณ์๊ฐ ๊ฐ์ง ์์ฑ์๊ฐ ์ ์ธ๋์ด ์๋ ๊ฒฝ์ฐ, ๋งค๊ฐ ๋ณ์ ์์ฑ์ ํธ์ถ์ ๋ฌธ์ ๊ฐ ์์ง๋ง, ๊ฐ์ฒด ๋ฐฐ์ด ์ ์ธํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์์ผ๋ฏ๋ก ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
๊ฐ์ฒด ๋ฐฐ์ด์ ์์ฑํ ๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋์ง ํ์ธํด์ผํ๋ค
โ๏ธ ๊ฐ์ฒด ๋ฐฐ์ด ์ฌ์ฉ
๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด๋ [] ์ฐ์ฐ์๋ก ๊ตฌ๋ถํ๋ค
์์ ๊ฐ์ฒด์ ๋ฉค๋ฒ ์ฌ์ด์ ์ (.) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
ํด๋์ค์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐ์ด์ ๋ค๋ฃฐ ์ ์๋ค
โ๏ธ ๋ฐฐ์ด ์๋ฉธ๊ณผ ์๋ฉธ์
ํจ์๊ฐ ์ข
๋ฃ๋๋ฉด ํจ์ ๋ด์ ์ ์ธ๋ ๋ฐฐ์ด๋ ์๋ฉธ๋๋ค
๋ฐฐ์ด์ด ์๋ฉธ๋๋ฉด ๋ชจ๋ ์์ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋ฉฐ ๊ฐ ์์ ๊ฐ์ฒด๋ง๋ค ์๋ฉธ์๊ฐ ํธ์ถ๋๋ค
๋์ ์ธ๋ฑ์ค์์๋ถํฐ ์์ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๊ณ , ๊ฐ ๊ฐ์ฒด๋ง๋ค ~() ์๋ฉธ์๊ฐ ์คํ๋๋ค
โ๏ธ ๊ฐ์ฒด ๋ฐฐ์ด ์ด๊ธฐํ
๊ฐ์ฒด ๋ฐฐ์ด์ ์์ฑํ ๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค
๋ฐฐ์ด์ ์ ์ธํ ๋ {} ์์ ํธ์ถํ ์์ฑ์๋ฅผ ์ง์ ํ๋ค
// ๊ฐ์ฒด ๋ฐฐ์ด ์ด๊ธฐํ
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
void setRadius(int r) { radius = r; }
double getArea();
};
double Circle::getArea()
{
return 3.14 * radius * radius;
}
int main()
{
Circle circleArray[3] = {Circle(10), Circle(20), Circle()};
for (int i = 0; i < 3; i++)
{
cout << "Circle " << i << "์ ๋ฉด์ ์ " << circleArray[i].getArea() << endl;
}
}
/*
Circle 0์ ๋ฉด์ ์ 314
Circle 1์ ๋ฉด์ ์ 1256
Circle 2์ ๋ฉด์ ์ 3.14
- ๊ฐ์ฒด ๋ฐฐ์ด ์ ์ธ
๊ฐ์ฒด ๋ฐฐ์ด ์ ์ธ๋ฌธ์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ๋ค
์ค์ง ๋งค๊ฐ ๋ณ์ ์๋ ๊ธฐ๋ณธ ์์ฑ์ ํธ์ถํ๋ค
์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ฝ์
ํ๋ฏ๋ก, ๊ฐ์ฒด ๋ฐฐ์ด ์์ฑ ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค
๋งค๊ฐ ๋ณ์๊ฐ ๊ฐ์ง ์์ฑ์๊ฐ ์ ์ธ๋์ด ์๋ ๊ฒฝ์ฐ, ๋งค๊ฐ ๋ณ์ ์์ฑ์ ํธ์ถ์ ๋ฌธ์ ๊ฐ ์์ง๋ง, ๊ฐ์ฒด ๋ฐฐ์ด ์ ์ธํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์์ผ๋ฏ๋ก ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
๊ฐ์ฒด ๋ฐฐ์ด์ ์์ฑํ ๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋์ง ํ์ธํด์ผํ๋ค
- ๊ฐ์ฒด ๋ฐฐ์ด ์ฌ์ฉ
๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด๋ [] ์ฐ์ฐ์๋ก ๊ตฌ๋ถํ๋ค
์์ ๊ฐ์ฒด์ ๋ฉค๋ฒ ์ฌ์ด์ ์ (.) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
ํด๋์ค์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐ์ด์ ๋ค๋ฃฐ ์ ์๋ค
- ๋ฐฐ์ด ์๋ฉธ๊ณผ ์๋ฉธ์
ํจ์๊ฐ ์ข
๋ฃ๋๋ฉด ํจ์ ๋ด์ ์ ์ธ๋ ๋ฐฐ์ด๋ ์๋ฉธ๋๋ค
๋ฐฐ์ด์ด ์๋ฉธ๋๋ฉด ๋ชจ๋ ์์ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋ฉฐ ๊ฐ ์์ ๊ฐ์ฒด๋ง๋ค ์๋ฉธ์๊ฐ ํธ์ถ๋๋ค
๋์ ์ธ๋ฑ์ค์์๋ถํฐ ์์ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๊ณ , ๊ฐ ๊ฐ์ฒด๋ง๋ค ~() ์๋ฉธ์๊ฐ ์คํ๋๋ค
- ๊ฐ์ฒด ๋ฐฐ์ด ์ด๊ธฐํ
๊ฐ์ฒด ๋ฐฐ์ด์ ์์ฑํ ๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค
๋ฐฐ์ด์ ์ ์ธํ ๋ {} ์์ ํธ์ถํ ์์ฑ์๋ฅผ ์ง์ ํ๋ค
*/
๐ ๋ค์ฐจ์ ๊ฐ์ฒด ๋ฐฐ์ด
๋ค์ฐจ์ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค
{} ์์ ์์ฑ์๋ฅผ ์ง์ ํ์ฌ ๋ฐฐ์ด์ ์ด๊ธฐํํ ์ ์๋ค
// Circle ํด๋์ค์ 2์ฐจ์ ๋ฐฐ์ด ์ ์ธ ๋ฐ ํ์ฉ
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
void setRadius(int r) { radius = r; }
double getArea();
};
double Circle::getArea()
{
return 3.14 * radius * radius;
}
int main()
{
Circle circles[2][3];
circles[0][0].setRadius(1);
circles[0][1].setRadius(2);
circles[0][2].setRadius(3);
circles[1][0].setRadius(4);
circles[1][1].setRadius(5);
circles[1][2].setRadius(6);
// ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด์ ๋ฉค๋ฒ ์ ๊ทผ
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << "Circle [" << i << ", " << j << "] ์ ๋ฉด์ ์ ";
cout << circles[i][j].getArea() << endl;
}
}
}
/*
Circle [0, 0] ์ ๋ฉด์ ์ 3.14
Circle [0, 1] ์ ๋ฉด์ ์ 12.56
Circle [0, 2] ์ ๋ฉด์ ์ 28.26
Circle [1, 0] ์ ๋ฉด์ ์ 50.24
Circle [1, 1] ์ ๋ฉด์ ์ 78.5
Circle [1, 2] ์ ๋ฉด์ ์ 113.04
- ๋ค์ฐจ์ ๊ฐ์ฒด ๋ฐฐ์ด
๋ค์ฐจ์ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค
{} ์์ ์์ฑ์๋ฅผ ์ง์ ํ์ฌ ๋ฐฐ์ด์ ์ด๊ธฐํํ ์ ์๋ค
*/
๐ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๋ฐํ
C์ธ์ด ์์๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๋ฐํ์ ์ํด malloc() / free() ํ์ค C ํจ์ ์ด์ฉ
C++ ์์๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๋ฐํ์ ์ํด new ์ delete ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค
new ์ฐ์ฐ์๋ ํ ๊ณต๊ฐ์ผ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น,
delete ์ฐ์ฐ์๋ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ผ๋ก ๋ฐํํ๋ค
๋ฐ์ดํฐ ํ์
* ํฌ์ธํฐ๋ณ์ = new ๋ฐ์ดํฐํ์
;
delete ํฌ์ธํฐ๋ณ์;
new ์ฐ์ฐ์๋ '๋ฐ์ดํฐํ์
'์ ํฌ๊ธฐ๋งํผ ํ์ผ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๊ณ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ค
'ํฌ์ธํฐ๋ณ์'๋ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๊ฐ์ง๋ค
delete ์ฐ์ฐ์๋ 'ํฌ์ธํฐ๋ณ์'๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ผ๋ก ๋ฐํํ๋ค
'๋ฐ์ดํฐํ์
'์ int, double, char ๋ฑ ๊ธฐ๋ณธ ํ์
๋ฟ ์๋๋ผ ๊ตฌ์กฐ์ฒด, ํด๋์ค๋ ํฌํจํ๋ค
ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด new ๋ NULL ์ ๋ฆฌํดํ๋ฏ๋ก, NULL ๊ฒ์ฌํ๋ ๊ฒ์ด ์ข๋ค
โ๏ธ ๋์ ํ ๋น ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ
new ๋ฅผ ์ด์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ๋, ์ด๊น๊ฐ์ ์ง์ ํ์ฌ ์ด๊ธฐํํ ์ ์๋ค
๋ฐ์ดํฐํ์
*ํฌ์ธํฐ๋ณ์ = new ๋ฐ์ดํฐํ์
(์ด๊น๊ฐ);
โ๏ธ delete ์ฌ์ฉ ์ ์ฃผ์
delete ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ ๋ ์ ์ ํ์ง ๋ชปํ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด, ์คํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค
// ์ ์ํ ๊ณต๊ฐ์ ๋์ ํ ๋น ๋ฐ ๋ฐํ
#include <iostream>
using namespace std;
int main()
{
int *p;
p = new int;
// p๊ฐ NULL ์ด๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ
if (!p)
{
cout << "๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค.";
return 0;
}
*p = 5;
int n = *p;
cout << "*p = " << *p << endl;
cout << "n = " << n << endl;
// ํ ๋น ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐํ
delete p;
}
/*
*p = 5
n = 5
- ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๋ฐํ
C์ธ์ด ์์๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๋ฐํ์ ์ํด malloc() / free() ํ์ค C ํจ์ ์ด์ฉ
C++ ์์๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๋ฐํ์ ์ํด new ์ delete ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค
new ์ฐ์ฐ์๋ ํ ๊ณต๊ฐ์ผ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น,
delete ์ฐ์ฐ์๋ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ผ๋ก ๋ฐํํ๋ค
๋ฐ์ดํฐ ํ์
* ํฌ์ธํฐ๋ณ์ = new ๋ฐ์ดํฐํ์
;
delete ํฌ์ธํฐ๋ณ์;
new ์ฐ์ฐ์๋ '๋ฐ์ดํฐํ์
'์ ํฌ๊ธฐ๋งํผ ํ์ผ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๊ณ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ค
'ํฌ์ธํฐ๋ณ์'๋ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๊ฐ์ง๋ค
delete ์ฐ์ฐ์๋ 'ํฌ์ธํฐ๋ณ์'๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ผ๋ก ๋ฐํํ๋ค
'๋ฐ์ดํฐํ์
'์ int, double, char ๋ฑ ๊ธฐ๋ณธ ํ์
๋ฟ ์๋๋ผ ๊ตฌ์กฐ์ฒด, ํด๋์ค๋ ํฌํจํ๋ค
ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด new ๋ NULL ์ ๋ฆฌํดํ๋ฏ๋ก, NULL ๊ฒ์ฌํ๋ ๊ฒ์ด ์ข๋ค
- ๋์ ํ ๋น ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ
new ๋ฅผ ์ด์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ๋, ์ด๊น๊ฐ์ ์ง์ ํ์ฌ ์ด๊ธฐํํ ์ ์๋ค
๋ฐ์ดํฐํ์
*ํฌ์ธํฐ๋ณ์ = new ๋ฐ์ดํฐํ์
(์ด๊น๊ฐ);
- delete ์ฌ์ฉ ์ ์ฃผ์
delete ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ ๋ ์ ์ ํ์ง ๋ชปํ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด, ์คํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค
*/
๐ ๋ฐฐ์ด์ ๋์ ํ ๋น ๋ฐ ๋ฐํ
new ์ delete ์ฐ์ฐ์๋ก ๋ฐฐ์ด์ ํ ๋น๋ฐ๊ณ ๋ฐํํ ์ ์๋ค
โ๏ธ ๋ฐฐ์ด์ ๋์ ํ ๋น/๋ฐํ์ ๊ธฐ๋ณธ ํ์
// ๋ฐฐ์ด์ ๋์ ํ ๋น
๋ฐ์ดํฐํ์
*ํฌ์ธํฐ๋ณ์ = new ๋ฐ์ดํฐํ์
[๋ฐฐ์ด์ ํฌ๊ธฐ]
// ๋ฐฐ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐํ
delte [] ํฌ์ธํฐ๋ณ์;
new ์ฐ์ฐ์๋ '๋ฐฐ์ด์ ํฌ๊ธฐ' ๋งํ ๋ฐฐ์ด์ ํ ๋น๋ฐ์ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ฉฐ,
delete ๋ 'ํฌ์ธํฐ๋ณ์' ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ๋ค
new ๋ฅผ ์ด์ฉํ๋ฉด int, char ๋ฑ์ ๊ธฐ๋ณธ ํ์
๊ณผ ๊ตฌ์กฐ์ฒด, ํด๋์ค ๋ฑ ์ฌ์ฉ์๊ฐ ์ ์ํ ํ์
์ ๋ฐฐ์ด์ ํ ๋น๋ฐ์ ์ ์๋ค
โ๏ธ ๋ฐฐ์ด์ ์ด๊ธฐํ ํ ๋ ์ฃผ์์ฌํญ
new ๋ก ๋ฐฐ์ด์ ๋์ ํ ๋น๋ฐ์ ๋ ์์ฑ์๋ฅผ ํตํด ์ง์ '์ด๊น๊ฐ'์ ์ง์ ํ ์ ์๋ค
// ๋ฐฐ์ด ์ด๊ธฐํ ๋ถ๊ฐ
int *pArray = new int [10][20];
// ์ด๊ธฐํ๋ ์ ์ ๋ฐฐ์ด ์ ์ธ
int *pArray = new int [] {1, 2, 3, 4,};
โ๏ธ ๋ฐฐ์ด์ delete ํ ๋ ์ฃผ์ ์ฌํญ
// new int[10] ์ผ ๊ฒฝ์ฐ
delete [] p;
// new int; ์ผ ๊ฒฝ์ฐ
delete p;
// ์ ์ํ ๋ฐฐ์ด์ ๋์ ํ ๋น ๋ฐ ๋ฐํ
#include <iostream>
using namespace std;
int main()
{
cout << "์
๋ ฅํ ์ ์์ ๊ฐ์๋?";
int n;
cin >> n;
if (n <= 0)
return 0;
// n ๊ฐ์ ์ ์ ๋ฐฐ์ด ๋ฐ ๋์ ํ ๋น
int *p = new int[n];
if (!p)
{
cout << "๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค.";
return 0;
}
for (int i = 0; i < n; i++)
{
cout << i + 1 << "๋ฒ์งธ ์ ์ : ";
cin >> p[i];
}
int sum = 0;
for (int i = 0; i < n; i++)
{
sum += p[i];
}
cout << "ํ๊ท = " << sum / n << endl;
// ๋ฐฐ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐํ
delete[] p;
}
/*
์
๋ ฅํ ์ ์์ ๊ฐ์๋?4
1๋ฒ์งธ ์ ์ : 3
2๋ฒ์งธ ์ ์ : 5
3๋ฒ์งธ ์ ์ : -23
4๋ฒ์งธ ์ ์ : 5
ํ๊ท = -2
- ๋ฐฐ์ด์ ๋์ ํ ๋น ๋ฐ ๋ฐํ
new ์ delete ์ฐ์ฐ์๋ก ๋ฐฐ์ด์ ํ ๋น๋ฐ๊ณ ๋ฐํํ ์ ์๋ค
- ๋ฐฐ์ด์ ๋์ ํ ๋น/๋ฐํ์ ๊ธฐ๋ณธ ํ์
// ๋ฐฐ์ด์ ๋์ ํ ๋น
๋ฐ์ดํฐํ์
*ํฌ์ธํฐ๋ณ์ = new ๋ฐ์ดํฐํ์
[๋ฐฐ์ด์ ํฌ๊ธฐ]
// ๋ฐฐ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐํ
delte [] ํฌ์ธํฐ๋ณ์;
new ์ฐ์ฐ์๋ '๋ฐฐ์ด์ ํฌ๊ธฐ' ๋งํ ๋ฐฐ์ด์ ํ ๋น๋ฐ์ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ฉฐ,
delete ๋ 'ํฌ์ธํฐ๋ณ์' ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ๋ค
new ๋ฅผ ์ด์ฉํ๋ฉด int, char ๋ฑ์ ๊ธฐ๋ณธ ํ์
๊ณผ ๊ตฌ์กฐ์ฒด, ํด๋์ค ๋ฑ ์ฌ์ฉ์๊ฐ ์ ์ํ ํ์
์ ๋ฐฐ์ด์ ํ ๋น๋ฐ์ ์ ์๋ค
- ๋ฐฐ์ด์ ์ด๊ธฐํ ํ ๋ ์ฃผ์์ฌํญ
new ๋ก ๋ฐฐ์ด์ ๋์ ํ ๋น๋ฐ์ ๋ ์์ฑ์๋ฅผ ํตํด ์ง์ '์ด๊น๊ฐ'์ ์ง์ ํ ์ ์๋ค
// ๋ฐฐ์ด ์ด๊ธฐํ ๋ถ๊ฐ
int *pArray = new int [10][20];
// ์ด๊ธฐํ๋ ์ ์ ๋ฐฐ์ด ์ ์ธ
int *pArray = new int [] {1, 2, 3, 4,};
- ๋ฐฐ์ด์ delete ํ ๋ ์ฃผ์ ์ฌํญ
// new int[10] ์ผ ๊ฒฝ์ฐ
delete [] p;
// new int; ์ผ ๊ฒฝ์ฐ
delete p;
*/
๐ ๊ฐ์ฒด์ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋์ ์์ฑ ๋ฐ ๋ฐํ
โ๏ธ new ๋ฅผ ์ด์ฉํ ๊ฐ์ฒด์ ๋์ ์์ฑ๊ณผ ์์ฑ์
ํด๋์ค *ํฌ์ธํฐ๋ณ์ = new ํด๋์ค์ด๋ฆ; // ๊ธฐ๋ณธ ์์ฑ์ ํธ์ถ
ํด๋์ค *ํฌ์ธํฐ๋ณ์ = new ํด๋์ค์ด๋ฆ(์์ฑ์ ๋งค๊ฐ๋ณ์๋ฆฌ์คํธ);
new ๋ ํด๋์ค ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉฐ, ์์ฑ์๋ฅผ ํธ์ถํ๋ค
โ๏ธdelete ๋ฅผ ์ด์ฉํ ๊ฐ์ฒด ๋ฐํ๊ณผ ์๋ฉธ์
๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๋ ๊ฐ์ฒด์ ๋ํ 'ํฌ์ธํฐ๋ณ์'๋ฅผ ์ด์ฉํ์ฌ ๋ฐํํ๋ค
delete ํฌ์ธํฐ๋ณ์;
delete ์ฌ์ฉ ์ 'ํฌ์ธํฐ๋ณ์'๋ ๋ฐ๋์ new๋ฅผ ์ด์ฉํ์ฌ ๋์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์์ฌ์ผ ํ๋ค
delete ๋ฅผ ์คํ๋๋ฉด, ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ์ง์ ์ ๊ฐ์ฒด์ ์๋ฉธ์๊ฐ ์คํ๋๋ค
// Circle ๊ฐ์ฒด์ ๋์ ์์ฑ ๋ฐ ๋ฐํ
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle();
Circle(int r);
~Circle();
void setRadius(int r) { radius = r; }
double getArea() { return 3.14 * radius * radius; }
};
Circle::Circle()
{
radius = 1;
cout << "์์ฑ์ ์คํ radius = " << radius << endl;
}
Circle::Circle(int r)
{
radius = r;
cout << "์์ฑ์ ์คํ radius = " << radius << endl;
}
Circle::~Circle()
{
cout << "์๋ฉธ์ ์คํ radius = " << radius << endl;
}
int main()
{
Circle *p, *q;
p = new Circle();
q = new Circle(30);
cout << p->getArea() << endl
<< q->getArea() << endl;
// ์์ฑํ ์์์ ๊ด๊ณ ์์ด ์ํ๋ ์์๋๋ก delete ๊ฐ๋ฅ
delete p;
delete q;
}
/*
์์ฑ์ ์คํ radius = 1
์์ฑ์ ์คํ radius = 30
3.14
2826
์๋ฉธ์ ์คํ radius = 1
์๋ฉธ์ ์คํ radius = 30
- ๊ฐ์ฒด์ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋์ ์์ฑ ๋ฐ ๋ฐํ
- new ๋ฅผ ์ด์ฉํ ๊ฐ์ฒด์ ๋์ ์์ฑ๊ณผ ์์ฑ์
ํด๋์ค *ํฌ์ธํฐ๋ณ์ = new ํด๋์ค์ด๋ฆ; // ๊ธฐ๋ณธ ์์ฑ์ ํธ์ถ
ํด๋์ค *ํฌ์ธํฐ๋ณ์ = new ํด๋์ค์ด๋ฆ(์์ฑ์ ๋งค๊ฐ๋ณ์๋ฆฌ์คํธ);
new ๋ ํด๋์ค ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉฐ, ์์ฑ์๋ฅผ ํธ์ถํ๋ค
- delete ๋ฅผ ์ด์ฉํ ๊ฐ์ฒด ๋ฐํ๊ณผ ์๋ฉธ์
๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๋ ๊ฐ์ฒด์ ๋ํ 'ํฌ์ธํฐ๋ณ์'๋ฅผ ์ด์ฉํ์ฌ ๋ฐํํ๋ค
delete ํฌ์ธํฐ๋ณ์;
delete ์ฌ์ฉ ์ 'ํฌ์ธํฐ๋ณ์'๋ ๋ฐ๋์ new๋ฅผ ์ด์ฉํ์ฌ ๋์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์์ฌ์ผ ํ๋ค
delete ๋ฅผ ์คํ๋๋ฉด, ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ์ง์ ์ ๊ฐ์ฒด์ ์๋ ค์๊ฐ ์คํ๋๋ค
*/
๐ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋์ ์์ฑ ๋ฐ ๋ฐํ
โ๏ธ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋์ ์์ฑ๊ณผ ์์ฑ์
ํด๋์ค์ด๋ฆ *ํฌ์ธํฐ๋ณ์ = new ํด๋์ค์ด๋ฆ [๋ฐฐ์ด ํฌ๊ธฐ];
new ๋ฅผ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก ๋ฐฐ์ด์ ์์ฑํ ๋, ๋งค๊ฐ ๋ณ์ ์๋ ์์ฑ์๋ฅผ ์ง์ ํธ์ถํ ์๋ ์๋ค
๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด๋ก๋ ์ด๊ธฐํํ ์ ์๋ค
โ๏ธ๊ฐ์ฒด ๋ฐฐ์ด์ ์ฌ์ฉ
๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด ๋ฐฐ์ด์ ๊ฐ์ฒด ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉ๋๋ค
โ๏ธ๋ฐฐ์ด์ ๋ฐํ๊ณผ ์๋ฉธ์
delete ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก ํ ๋น๋ฐ์ ๋ฐฐ์ด์ ๋ฐํํ๋ ํ์
delete [] ํฌ์ธํฐ๋ณ์;
delete๋ ๋ฐฐ์ด์ ๋ฐํํ๊ธฐ ์ง์ , ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด์ ์๋ฉธ์๋ฅผ ์งํํ๋ค
์๋ฉธ์์ ์คํ ์์๋ ์์ฑ์ ๋ฐ๋ ์์์ด๋ค
โ๏ธ ๋์ ์ผ๋ก ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ๋์ ๋ฐํํด์ผ ํ๋๊ฐ?
ํ heap ์ ํ๋ก๊ทธ๋จ์ด ์คํ ์ค์ new ๋ฅผ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก ํ ๋น๋ฐ์ ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ
๋๋ถ๋ถ ์ด์์ฒด์ ์์ ํ๋ก๊ทธ๋จ๋ง๋ค ํ์ด ๋ฐ๋ก ์ฃผ์ด์ง๊ธฐ ๋๋ฌธ์, ํ ํ๋ก๊ทธ๋จ์ด ๋์ ์ผ๋ก ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋ ๊ฒ์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ํ์ ์ํฅ ์ฃผ์ง ์๋๋ค
๋ค๋ง, ํ์์๊ฒ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ์ง ์๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋๊ตฌ์ฌ ์๊ธฐ๋ฉด, ํ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ์ฌ ํ ๋น ๋ฐ์ ์ ์๋ค
ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์, ํ ์ ์ฒด๊ฐ ์ด์์ฒด์ ์ ์ํด ๋ฐํ๋๋ฏ๋ก ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ๊ฑฑ์ ์ ์ํด๋ ๋๋ค
โ๏ธ ๋์ ์ผ๋ก ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋์
๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์์ด๋ฒ๋ ค ํ์ ๋ฐํํ ์ ์๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค
ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ฉด ๋์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ชจ๋ ์์คํ
ํ์ผ๋ก ์๋ ๋ฐํ๋๋ค
// Circle ๋ฐฐ์ด์ ๋์ ์์ฑ ๋ฐ ๋ฐํ
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle();
Circle(int r);
~Circle();
void setRadius(int r) { radius = r; }
double getArea() { return 3.14 * radius * radius; }
};
Circle::Circle()
{
radius = 1;
cout << "์์ฑ์ ์คํ radius = " << radius << endl;
}
Circle::Circle(int r)
{
radius = r;
cout << "์์ฑ์ ์คํ radius = " << radius << endl;
}
Circle::~Circle()
{
cout << "์๋ฉธ์ ์คํ radius = " << radius << endl;
}
int main()
{
// ๊ฐ์ฒด ๋ฐฐ์ด์ ๋์ ์์ฑ
Circle *pArray = new Circle[3];
pArray[0].setRadius(10);
pArray[1].setRadius(20);
pArray[2].setRadius(30);
for (int i = 0; i < 3; i++)
{
cout << pArray[i].getArea() << endl;
}
// ํฌ์ธํฐ p์ ๋ฐฐ์ด์ ์ฃผ์๊ฐ ์ค์
Circle *p = pArray;
for (int i = 0; i < 3; i++)
{
cout << p->getArea() << endl;
// ๋ค์ ์์์ ์ฃผ์ ์ฆ๊ฐ
p++;
}
// ๊ฐ ๊ฐ์ฒด์ ์๋ฉธ์ ~Circle() ์คํ
// ๊ฐ์ฒด ๋ฐฐ์ด ๋ฐํ
delete[] pArray;
}
/*
์์ฑ์ ์คํ radius = 1
์์ฑ์ ์คํ radius = 1
์์ฑ์ ์คํ radius = 1
314
1256
2826
314
1256
2826
์๋ฉธ์ ์คํ radius = 30
์๋ฉธ์ ์คํ radius = 20
์๋ฉธ์ ์คํ radius = 10
- ๊ฐ์ฒด ๋ฐฐ์ด์ ๋์ ์์ฑ ๋ฐ ๋ฐํ
๊ฐ์ฒด ๋ฐฐ์ด์ ๋์ ์์ฑ๊ณผ ์์ฑ์
ํด๋์ค์ด๋ฆ *ํฌ์ธํฐ๋ณ์ = new ํด๋์ค์ด๋ฆ [๋ฐฐ์ด ํฌ๊ธฐ];
new ๋ฅผ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก ๋ฐฐ์ด์ ์์ฑํ ๋, ๋งค๊ฐ ๋ณ์ ์๋ ์์ฑ์๋ฅผ ์ง์ ํธ์ถํ ์๋ ์๋ค
๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด๋ก๋ ์ด๊ธฐํํ ์ ์๋ค
- ๊ฐ์ฒด ๋ฐฐ์ด์ ์ฌ์ฉ
๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด ๋ฐฐ์ด์ ๊ฐ์ฒด ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉ๋๋ค
- ๋ฐฐ์ด์ ๋ฐํ๊ณผ ์๋ฉธ์
delete ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก ํ ๋น๋ฐ์ ๋ฐฐ์ด์ ๋ฐํํ๋ ํ์
delete [] ํฌ์ธํฐ๋ณ์;
delete๋ ๋ฐฐ์ด์ ๋ฐํํ๊ธฐ ์ง์ , ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ฒด์ ์๋ฉธ์๋ฅผ ์งํํ๋ค
์๋ฉธ์์ ์คํ ์์๋ ์์ฑ์ ๋ฐ๋ ์์์ด๋ค
*/