2 minute read

const의 의미

const int num = 10; // 변수 num을 상수화
const int * ptr1 =&val1; // 포인터 ptr1을 이용해 val1의 값을 변경할 수 없음
int * const ptr2=&val2; // 포인터 ptr2가 상수화 됨
const int * const ptr3=&val3; // 포인터 ptr3가 상수화 되었으며, ptr3를 이용해서 val3의 값을 변경할 수 없음

실행중인 프로그램의 메모리 공간

  • 실행 중인 프로그램은 운영체제로부터 메모리 공간을 할당받는데, 이는 크게 데이터, 스택, 힙 영역으로 나뉜다. 각각의 영역에는 어떠한 형태의 변수가 할당되는지 설명해보자. 특히 C언어의 mallocfree함수와 관련해서도 설명해보자.

    • 데이터 : 전역변수가 저장되는 영역
    • 스택 : 지역변수 및 매개변수가 저장되는 영역
    • 힙 : malloc 함수호출에 의해 프로그램이 실행되는 과정에서 동적으로 할당이 이뤄지는 영역
    • malloc&free : malloc 함수 호출에 의해 할당된 메모리 공간은 free 함수 호출을 통해서 소멸하지 않으면 해제되지 않는다.

Call-by-value vs Call-by-reference

  • 함수의 호출형태는 크게 ‘값에 의한 호출(Call-by-value)’과 ‘참조에 의한 호출(Call-by-reference)’로 나뉜다. 이 둘을 나누는 기준이 무엇인지, 두 int형 변수의 값을 교환하는 swap함수를 예로 들어가면서 설명해보자

void SwapByValue(int num1, int num2)
{
    int temp=num1;
    num1= num2;
    num2=temp;
    //Call-by-vlue
}

void SwapByRef(int * ptr1, int * ptr2)
{
    int temp=*ptr1;
    *ptr1 = *ptr2;
    *ptr2=temp;
    //Call-by-reference
}

참을 의미하는 true와 거짓을 의미하는 false

자료형 bool

#include <iostream>
using namespce std;

bool IsPositive(int num)
{
    if(num<0)
        return false;
    else
        return true;
}

int main(void)
{
    bool isPos;
    int num;
    cout<<"Input number: ";
    cin>>num;
    isPos = IsPositive(num);
    is(isPos)
        cout<<"Positive number"<<endl;
    else
        cout<<"Negative number"<<endl;
    return 0;
}

참조자(reference)의 이해

int num1 = 2010; // 변수의 선언으로 인해서 num1이라는 이름으로 메모리 공간이 할당된다.
int &num2 = num1; // 참조자의 선언으로 인해서 num1의 메모리 공간에 num2라는 이름이 추가로 붙게된다.

참조자 관련 예제와 참조자의 선언

int main(void)
{
    int num1 = 1020;
    int &num2 = num1;
    num2 = 3047;
    cout<<"VAL: "<<num1<<endl;
    cout<<"REF: "<<num2<<endl;

    cout<<"VAL: "<<&num1<<endl;
    cout<<"REF: "<<&num2<<endl;

}

참조자를 이용한 Call-by-reference

  • 참조자 기반의 Call-by-reference!
  • 매개변수는 함수가 호출될 때 선언이 되는 변수이므로, 함수 호출의 과정에서 선언과 동시에 전달되는 대상으로 초기화된다.
  • 매개변수에 선언된 참조자는 여전히 선언과 동시에 초기화된다.
#include <iostream>
using namespace std;

void SwapByRef2(int &ref1, int &ref2)
{
    int temp=ref1;
    ref1 = ref2;
    ref2 = temp;
    // Call-by-reference
}

void SwapByRef(int * ptr1, int * ptr2)
{
    int temp=*ptr1;
    *ptr1 = *ptr2;
    *ptr2=temp;
    //Call-by-reference
}

int main(void)
{
    int val1 = 10;
    int val2 = 20;
    SwapByRef2(val1,val2);
    cout<<"val1: "<<val1<<endl;
    cout<<"val2: "<<val2<<endl;
    SwapByRef(&val1,&val2);
    cout<<"val1: "<<val1<<endl;
    cout<<"val2: "<<val2<<endl;
    return 0;
}

// 출력 결과
// $ ./a.out
// val1: 20
// val2: 10
// val1: 10
// val2: 20

new & delete

  • malloc을 대안하는 메모리의 동적 할당 방법
  • 크기를 바이트 단위로 계산하는 일을 거치지 않아도 된다..!
  • new로 할당한 메모리 공간은 반드시 delete 함수 호출을 통해 소멸해야한다.
int * ptr1 = new int; // int 형 변수의 할당
double * ptr2 = new double; // double형 변수의 할당
int * arr1 = new int[3]; // 길이가 3인 int 형 배열의 할당
double * arr2 = new double[7]; //길이가 7인 double형 배열의 할당

delete ptr1; //앞서 할당한 int형 변수의 소멸
delete ptr2; // 앞서 할당한 double형 변수의 소멸
delete []arr1; // 앞서 할당한 int형 배열의 소멸
delete []arr2; // 앞서 할당한 double 형 배열의 소멸

포인터를 사용하지 않고 힙에 접근하기

  • C언어의 경우 힙영역으로의 접근을 위해서는 반드시 포인터를 사용해야만 했다. 하지만 C++에서는 참조자를 이용한 접근도 가능하다!
int *ptr = new int;
int &ref = *ptr;
ref= 20;
cout<<*ptr<<endl;

Categories:

Updated: