SH1R0_HACKER
Chapter02의 시작에 앞서 (C언어의 복습을 유도하는 확인학습 문제) 본문
Part 01 C++로의 전환
Chapter02 C언어 기반의 C++ 2
02-1 Chapter 02의 시작에 앞서
[문제 1] 키워드 const의 의미
키워드 const는 어떠한 의미를 갖는가? 다음 문장들을 대상으로 이를 설명해보자.
1) const int num = 10;
2) const int* ptr1 = &val1;
3) int* const ptr2 = &val2;
4) const int* const ptr3 = &val3;
[문제 1 답안]
const를 변수 선언 앞에 붙이면 상수가 된다. 선언 시에 const가 붙여진 변수는 일단 초기화된 후에 그 값이 변경될 수 없다.
형식 : const 자료형 변수이름 = 초기값
설명 : const를 사용하면 값을 변경할 수 없는 변수를 정의할 수 있다.
예 : const int EXCHANGE_RATE = 1120;
1) const int num = 10; // 변수 num을 상수화 한다. num의 값은 변경할 수 없다.
2) const int* ptr1 = &val1; // ptr1이 가리키는 곳(val1)의 내용을 변경할 수 없다. ptr1은 변경이 가능하다.
3) int* const ptr2 = &val2; // ptr2가 가리키는 곳(val2)의 내용은 변경할 수 있다. ptr2는 변경이 불가능하다.
4) const int* const ptr3 = &val3; // 포인터 ptr3가 상수화 되었으며, ptr3를 이용해서 val3의 값을 변경할 수 없다.
[문제 2] 실행중인 프로그램의 메모리 공간
실행중인 프로그램은 운영체제로부터 메모리 공간을 할당 받는데, 이는 크게 데이터, 스택, 힙 영역으로 나뉜다. 각각의 영역에는 어떠한 형태의 변수가 할당되는지 설명해보자. 특히 C언어의 malloc과 free함수와 관련해서도 설명해보자.
[문제 2 답안]
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다.
따라서 컴퓨터의 운영체제는 프로그램 실행을 위해 다양한 메모리 공간을 제공하고 있습니다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같습니다.
코드(code) 영역 : 메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부릅니다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.
데이터(data) 영역 : 메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.
스택(stack) 영역 : 메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다. 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다. 스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다. 이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.
힙(heap) 영역 : malloc 함수 호출에 의해 프로그램이 실행되는 과정에서 동적으로 할당이 이뤄지는 영역. 메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다. 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
malloc() 함수 : malloc() 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해줍니다.
malloc() 함수의 원형은 다음과 같습니다. (C언어)
#include <stdlib.h>
void *malloc(size_t size);
// void = 동적 메모리의 주소
// size_t = unsigned int
malloc() 함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받습니다. 이 함수는 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 블록을 찾습니다. 이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환합니다.
힙 영역에 할당할 수 있는 적당한 블록이 없을 때에는 널 포인터를 반환합니다. 주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용해야 합니다.
▶ malloc() 함수의 원형에서 볼 수 있는 size_t 타입은 부호없는 정수라고 이해하시면 됩니다.
free() 함수 : free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수입니다.
데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되어, 프로그램이 실행되는 내내 고정됩니다. 하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변화됩니다.
따라서 free() 함수를 사용하여 다 사용한 메모리를 해제해 주지 않으면, 메모리가 부족해지는 현상이 발생할 수 있습니다. 이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(memory leak)라고 합니다.
free() 함수의 원형은 다음과 같습니다. (C언어)
#include <stdlib.h>
void free(void *ptr);
free() 함수는 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달받습니다.
인수의 타입이 void형 포인터로 선언되어 있으므로, 어떠한 타입의 포인터라도 인수로 전달될 수 있습니다.
[ C언어 복습 - 동적메모리 ]
■ 동적 메모리 할당(dynamic memory allocation)이란 프로그램이 실행 도중에 동적으로 메모리를 할당받는 것을 말한다. 프로그램에서는 필요한 만큼의 메모리를 할당받아서 사용하고, 사용이 끝나면 메모리를 반납한다. 필요한 만큼만 할당을 받고 또 필요한 때에 사용하고 반납하기 때문에 메모리를 매우 효율적으로 사용할 수 있다.
#include <iostream>
using namespace std;
int main()
{
int *score = (int*)malloc(100 * sizeof(int)); // 동적 메모리 할당
if (score == NULL)
{
cout << "동적 메모리 할당 오류" << endl;
exit(1);
}
for (int i = 0; i < 100; i++) // 동적 메모리 사용
{
score[i] = 0;
}
free(score); // 동적 메모리 반납
return 0;
}
[문제 3] Call-by-value vs. Call-by-reference
함수의 호출형태는 크게 '값에 의한 호출(Call-by-value)'과 '참조에 의한 호출(Call-by-reference)'로 나뉜다. 이 둘을 나누는 기준이 무엇인지, 두 int형 변수의 값을 교환하는 Swap 함수를 예로 들어가면서 설명해보자.
[문제 3 답안]
함수가 외부로부터 매개 변수를 통하여 데이터를 받는 방법은 크게 나누어서 두 가지가 있다.
● 값에 의한 호출(call-by-value): 복사본이 전달된다.
● 참조에 의한 호출 (call-by-reference): 원본이 전달된다.
아래는 두 int형 변수의 값을 교환하는 Swap 함수이다.
#include <iostream>
using namespace std;
void SwapByValue(int num1, int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
} // Call-by-value
void SwapByRef(int* ptr1, int* ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
} // Call-by-reference
int main(void)
{
int num1 = 10, num2 = 20;
SwapByValue(num1, num2);
cout << "SwayByValue" << endl;
cout << "num1 : " << num1 << endl; // num1 : 10 출력
cout << "num2 : " << num2 << endl; // num2 : 20 출력
cout << "=====================" << endl;
SwapByRef(&num1, &num2);
cout << "SwapByRef" << endl;
cout << "num1 : " << num1 << endl; // num 1 : 20 출력
cout << "num2 : " << num2 << endl; // num 2 : 10 출력
return 0;
}
'Programming Language > C++' 카테고리의 다른 글
Chapter04 클래스의 완성 (작성중) (0) | 2020.10.18 |
---|---|
Chapter03 클래스의 기본 (0) | 2020.10.18 |
Chapter02 C언어 기반의 C++ 2 (0) | 2020.10.18 |
Chapter01 C언어 기반의 C++ 1 (0) | 2020.10.18 |