๐ ์ด์ ๊ธ : [C++] ํฌ์ธํฐ ํ๋ฐฉ์ ์ดํดํ๊ธฐ (Call by Value vs Call by Reference)
Memory ์์ญ (Stack vs Heap)
์ปดํจํฐ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ
์ ์๋์ ๊ฐ์ด ๋๋์ด์๋ค.
- Code : ์คํํ ํ๋ก๊ทธ๋จ์ ์ฝ๋๊ฐ ์ ์ฅ๋จ
- Data : ์ ์ญ๋ณ์์ static๋ณ์๊ฐ ์ ์ฅ๋๋ฉฐ ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์๊น์ง ์ฌ๋ผ์ง์ง ์๊ณ ๋จ์์์
- Heap : ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์์ญ์ด๋ฉฐ ํ๋ก๊ทธ๋๋จธ์ ์ํด ํ ๋น( C++ :
new
, C :malloc
) ๋ฐ ํด์ ( C++ :delete
, C :free
)๋จ - Stack : ์ง์ญ๋ณ์์ ๋งค๊ฐ๋ณ์๊ฐ ํ ๋น๋๊ณ ํจ์๋ฅผ ๋น ์ ธ๋๊ฐ๋ฉด ์๋ ์๋ฉธ๋จ
์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น vs ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
ํ๋ก๊ทธ๋๋ฐ ๊ด์ ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์๋ ํฌ๊ฒ stack
๊ณผ heap
๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๋ค.
์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉด ์ปดํ์ผ ์ stack
์์ญ์ ํ ๋น๋๋ฉฐ, ํจ์๋ฅผ ๋น ์ ธ๋๊ฐ ๋ ์๋ฉธ๋๋ค.
ํ๋ก๊ทธ๋จ ์ปดํ์ผ ์ stack
์ ์ผ๋ง๋งํผ์ ํฌ๊ธฐ๋ก ํ ๋น์ ํด์ผํ๋์ง ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์, ์ปดํ์ผ ์ดํ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋ค.
๋ฐ๋ผ์ ์ ์ ๋ฐฐ์ด ์ ์ธ ์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ช ์ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ๋ฐ๋์ ์์๋ก ๋ช ์ํด์ผ ํ๋ค.
int main() {
int n = 10;
int arr[n]; // ๋ถ๊ฐ๋ฅ
int arr[10]; // ๊ฐ๋ฅ
}
๋ฐ๋ฉด ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ heap
์์ญ์ ํ ๋น๋๋ค.
์์์ ๋ค๋ฃจ์๋ฏ์ด heap
์ ํ๋ก๊ทธ๋๋จธ์ ์ํด ํ ๋น(new)๋๊ฑฐ๋ ์๋ฉธ(delete)๋๋ค.
๋ฐ๋ผ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ํ ๋ ์ํ๋ ํฌ๊ธฐ๋ก ํ ๋นํ ์ ์๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก ํฌ์ธํฐ ๋ณ์๋ stack
์ ํ ๋น๋๋ค.
int main() {
int n = 10;
int* arr = new int[n]; // arr ํฌ์ธํฐ ๋ณ์๋ stack์ ํ ๋น๋๋ฉฐ, arr ๋ฐฐ์ด์ heap์ ํ ๋น๋จ
}
new & delete
์์์ ํ๋ ์ด์ผ๊ธฐ์ง๋ง, ์ ์ ๋ฉ๋ชจ๋ฆฌ
๋ Compile ์์ stack
์์ญ์ ํ ๋น๋๊ณ ํจ์๋ฅผ ๋น ์ ธ๋์ฌ ๋ ์๋ฉธ๋๋ค.
๋ฐ๋ฉด ๋์ ๋ฉ๋ชจ๋ฆฌ
๋ Runtime ์ ํ๋ก๊ทธ๋๋จธ์ ์๋๋๋ก heap
์์ญ์ ํ ๋น๋๊ณ ์๋ฉธ๋๋ค.
๋ฐ๋ผ์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ control ํ๊ธฐ ์ํด ๊ท์น์ ์ ํด๋์์ผ๋ฉฐ, C++์์๋ ํ ๋น ์ new
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉฐ ์๋ฉธ ์์ delete
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
heap
์์ญ์ ๋์ ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฒฝ์ฐ ์ ์ ์ผ๋ก ํ๋ก๊ทธ๋๋จธ์ ์ํด ๊ด๋ฆฌ๋๋ฏ๋ก, ์ฌ์ฉ์ด ๋๋๋ค๋ฉด ๋ฐ๋์ delete๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
์ฐธ๊ณ ๋ก ๋์ ๋ฐฐ์ด์ delete ํ๋ ๊ฒฝ์ฐ ๋ฐฐ์ด์ด๋ผ๋ ๊ฒ์ ๋ช
์ํ๊ธฐ ์ํด delete[]
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ค.
// ํ ๋น
int *pData = new int;
int *array = new int[size];
// ์๋ฉธ
delete pData;
delete[] array;
2์ฐจ์ ๋ฐฐ์ด์ ๋์ ํ ๋น
2์ฐจ์ ๋ฐฐ์ด์ ๋์ ํ ๋น ํ๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
- mat : int**ํ
- mat[i] : int*ํ
- mat[i][j] : intํ
2์ฐจ์ ๋์ ๋ฐฐ์ด์ ๋จ์ํ๊ฒ ํ ์ค๋ก ์ ์ธํ๊ธฐ ํ๋ค๊ณ loop๋ฅผ ๋๋ฉฐ ์ผ์ผ์ด ํ ๋น ๋ฐ ํด์ ๋ฅผ ํด์ค์ผ ํ๋ค.
#include <iostream>
using namespace std;
// intํ 2์ฐจ์ ๋ฐฐ์ด ๋์ ํ ๋น
int** alloc2DArr (int rows, int cols){
if(rows <= 0 || cols <= 0) return NULL;
int** mat = new int* [rows];
for (int i=0 ; i<rows ; i++ )
mat[i] = new int[cols];
return mat;
}
// intํ 2์ฐจ์ ๋ฐฐ์ด ๋์ ํด์
void free2DArr ( int** mat, int rows, int cols=0){
if(mat != NULL){
for(int i=0 ; i<rows ; i++)
delete[] mat[i];
delete[] mat;
}
}
int main() {
int **mat;
int rows, cols;
cin >> rows >> cols;
// mat ํ ๋น
mat = alloc2DArr(rows, cols);
// mat[][] ๋๋ค ์
๋ ฅ
for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
mat[i][j] = rand()%100;
}
}
// mat ์ถ๋ ฅ
for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
cout << mat[i][j] << " ";
}
cout << endl;
}
// mat ํด์
free2DArr(mat, rows, cols);
return 0;
}
์ฐธ๊ณ ๋ก 2์ค loop๋ฅผ ๋๋ฆฌ๋ ๊ฒ๋ณด๋ค memset
(#include <string.h>
)์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ฉํ๋ค.
๋ํ ์ด๋ณด๋ค vector๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ฑ ํธ๋ฆฌํ๊ณ ๋น ๋ฅด๋ค.
(์์ ๋ด์ฉ์ ๋์ค์ ๋ฐ๋ก ํฌ์คํ ...)