[C++] ๋ฉ”๋ชจ๋ฆฌ ์ •์  ํ• ๋‹น vs ๋™์  ํ• ๋‹น (Stack vs Heap)
IT/Programming

[C++] ๋ฉ”๋ชจ๋ฆฌ ์ •์  ํ• ๋‹น vs ๋™์  ํ• ๋‹น (Stack vs Heap)

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“ƒ ์ด์ „ ๊ธ€ : [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๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ณ  ๋น ๋ฅด๋‹ค.

(์œ„์˜ ๋‚ด์šฉ์€ ๋‚˜์ค‘์— ๋”ฐ๋กœ ํฌ์ŠคํŒ…...)

 

 

728x90
๋ฐ˜์‘ํ˜•