동적메모리 할당(dynamic memory allocation) : 프로그램이 실행 도중에 동적으로 메모리를 할당받는 것

- 필요할 때 필요한 만큼만 할당받을 수 있기 때문에 메모리 효율적 사용 가능

 

<과정>

(1) 할당받을 크기 결정 후 라이브러리 함수를 호출하여 운영 체제에게 메모리를 요청

(2) 충분한 메모리가 존재하면 위의 요청이 승인되고 메모리가 할당됨

(3) 프로그램 : 할당된 메모리 사용

(4) 사용이 끝나면 메모리를 다시 운영체제에 반납함

   - 반납하지 않으면 다른 프로그램이 동적 메모리를 사용할 수 없게 됨

 

<C언어>

- malloc( )과 free( ) 라고 하는 라이브러리 함수 사용

 

malloc( ) 과 free( )를 C++에서 사용할 경우 아래와 같이 사용한다 

#include <iostream>
using namespace std;

int main(){
	const int MAX_SIZE = 100;
	int *pi;	//동적메모리를 가리키는 포인터
    
	pi = (int *)malloc(MAX_SIZE * sizeof(int));
	for(int i = 0; i< MAX_SIZE <i++)
		*pi=0;		//동적메모리 사용
	
	free(pi);		//동적메모리 반납
	return 0;
}

 

- malloc( ) 함수의 인수는 반드시 바이트 단위의 크기여야함

- malloc( )이 반납하는 void형 포인터를 int형 포인터로 변환하여 사용해야함

 

<C++>

new와 delete라는 전용 연산자 사용

#include <iostream>
using namespace std;

int main() {
	int *pi;	//동적메모리를 가리키는 포인터
	pi = new int[100];	//동적 메모리 할당	(크기가 100인 동적 배열 생성)
	for (int i = 0; i < 100; i++)
		*(pi + i) = 0;	//동적메모리 사용
	delete[] pi;		//동적메모리 반납	(동적배열 반납)

	return 0;
}

 

(1) 동적메모리 할당 - new 연산자 사용

동적 메모리 할당 성공 -> new는 할당된 메모리 블록을 가리키는 포인터 반환

                       실패 -> NULL이 반환

따라서 반환값이 NULL인지 검사할 것

 

(2) 동적메모리 사용

- 동적 메모리 공간은 이름이 없기 때문에 포인터를 이용하여 사용가능

- 반환된 포인터를 통하여 메모리 블록에 데이터를 쓰고 읽음

 

int *pia = new int[100]; 	//크기가 100인 int 형 동적배열 할당

//동적 메모리 사용
*(pia+i)=0;	//동적으로 할당된 배열의 i번째 원소에 정수 0이 저장
pia[i]=0;	//동적으로 할당된 배열의 i번째 원소에 정수 0이 저장

 

(3) 동적 메모리 반납 - delete 사용

- 동적 메모리 공간이 더 이상 필요가 없는 경우에는 명시적으로 동적 메모리를 반납해야함

- delete의 대상은 할당된 메모리 블록을 가리키는 포인터

delete pi;	//동적 할당 int형 공간 반납
delete[] pia;	//동적 할당 배열 반납

 

변수 : 변수가 사용될 수 있는 범위에 따라 지역변수, 전역변수로 나누어짐

 

지역변수 (local variable) : 블록 안에서만 정의되는 변수

- 해당 블록 안에서만 접근과 사용 가능

   cf) 블록 : 중괄호로 둘러싸인 영역

- 블록이 시작할 때 스택(stack)이라는 메모리 공간에 만들어짐

- 지역 변수에 할당된 공간은 블록 끝에서 반환됨 -> 이때 지역 변수도 사라짐

- 지역변수는 반드시 초기화를 시켜주어야 함

   - 지역 변수는 컴파일러에 의하여 자동으로 0으로 초기화 되지 않음

   -> 초기값을 정해주지 않았다면 아무의미 없는 값(쓰레기값(garbage value))이 들어가 있음

 

< C언어와 C++언어에서의 지역변수 사용 차이> 

C 블록의 시작부분에서만 선언 가능( 중간에서는 선언 불가능)
C++ 블록의 어디에서든지 선언 가능

 

함수의 매개변수 : 함수의 헤더 부분에 정의 되어 있는 변수

- 일종의 지역변수 (지역변수가 지니는 모든 특징 갖고있음)

 지역변수와 다른점 : 함수를 호출할 때 넣어주는 인자 값으로 초기화 되어있음

 

전역변수 (global variable) : 함수의 외부에서 선언되는 변수

- 해당 소스 파일의 어느 곳에서든 사용 가능(소스파일 전체)

- 전역변수를 초기화하지 않으면 컴파일러에 의해 0으로 초기화 

- 전역변수는 프로그램 시작과 동시에 생성되어 프로그램이 종료 되기 전까지 메모리에 존재

- 전역변수는 블록 안에서만 사용하기에 부담이 있음

 

정적 지역 변수(static variable)

- 블록에서만 사용되지만 블록을 벗어나도 자동으로 제거 X

- 지역변수를 정적변수로 만듦 ( static 앞에 붙여서 사용)

- 프로그램이 시작할 때 메모리에 생성되고 프로그램 실행 종료 시 메모리에서 제거됨

- 정적변수는 이전값을 기억한다. 

 

#include <iostream>
using namespace std;

void sub(void) {
	int i = 0;
	static int s = 0;	//정적변수 선언
	i++;
	s++;
	cout << "( " << i << " , " << s << " )" << endl;

}
int main(void) {
	sub();	// (1,1)출력
	sub();	// (1,2) 출력
	sub();	//(1,3) 출력 
	return 0;
}

 

위의 예시를 보면

지역변수 i 는 sub()함수를 호출할 때마다 생성되고 호출이 끝나면 메모리에서 제거됨

정적 변수 s의 값은 한번 생성되면 함수의 호출이 끝나도 제거되지않기 때문에 이전의 값을 유지함

 

함수 정의에서 선언된 매개변수

- 원칙적으로는 호출 시에 값을 전달

- 전달되는 값은 동일한 자료형 

 

void sub(double value);

 

- 위의 예시는 함수 원형이 선언된 sub()함수 이다. sub()함수는 double값을 호출함수가 전달해야함

- sub()에 전달되는 인자가 double형이 아니면 컴파일 에러발생

- [C++] 인수 전달하지 않아도 디폴트값을 대신 넣어주는 기능 존재 

           : default parameter (디폴트 매개변수)

 

void sub(double value = 1.0);	//함수 원형 정의

 

- 위의 예시의 경우, sub()에 인수가 주어지지 않으면 매개변수는 1.0이라는 디폴트 값을 가지게 됨

- 디폴트 매개변수는 원형에서만 정의됨(함수 정의 시 디폴트값 표시 X)

- 디폴트 매개변수는 반드시 오른쪽 매개변수에서부터 시작하여서 왼쪽으로 진행하면서 정의해야함

    : 함수 호출 시, 반드시 첫번째 인수부터 값을 주어야하기 때문

 

void func(int p1, int p2, int p3=30);			//OK 
void func(int p1, int p2=20, int p3=30);		//OK 
void func(int p1=40, int p2=20, int p3=30);		//OK 
void func(int p1=40, int p2, int p3);			//컴파일 에러
void func(int p1=40, int p2=20, int p3);		//컴파일 에러

 

<디폴트 매개변수의 예>

 

#include <iostream>
using namespace std;

int calc_deposit(int salary = 300, int month = 12);	//default parameter

int main() {
	cout << "0개의 디폴트 매개 변수 사용" << endl;
	cout << calc_deposit(200, 6) << endl;		//1200

	cout << "1개의 디폴트 매개 변수 사용" << endl;
	cout << calc_deposit(200) << endl;		//2400	

	cout << "0개의 디폴트 매개 변수 사용" << endl;
	cout << calc_deposit() << endl;			//3600

	return 0;
}

int calc_deposit(int salary, int month) {
	return salary * month;
}

 

 

+ Recent posts