<c++ 기초=""> 변수와 스코프(지역변수와 전역변수) 02.14</c++>
변수의 종류 파악하기 지금까지 변수와 배열을 사용했던 곳은 main() 함수 안이거나 직접 만든 함수 안이었다. 그러나 변수와 배열의 선언은 반드시 함수 안에서만 해야 하는 것은 아니다. 변수와
nybot-house.tistory.com
메모리의 동적인 확보
전역 변수의 메모리는 프로그램이 시작될 때 확보된다. 또한 일반 지역 변수의 메모리는 함수가 선언되고 호출될 때 확보된다. 이 두 가지 방법 외에도 프로그래머가 원하는 타이밍에 메모리를 확보하는 방법이 있다. 이것을 동적 메모리 확보(dynamic allocation)라고 부른다.
이 방법을 사용하면 변수를 이용한 메모리 사용법과 다르게 프로그래머가 메모리를 확보할 시점을 선택할 수 있다. 동적으로 메모리를 확보할 때는 new라는 연산자를 사용한다.
포인터 = new 형명;
ex)
동적으로 메모리를 확보하기 위해서, 먼저 확보할 형의 포인터를 준비해야 한다.
(1) new연산자는 메모리를 확보한 다음,
(2) 확보한 메모리의 주소를 리턴한다.
(3) 마지막으로 이 주소를 포인터 pA에 저장하고 있다.
동적으로 메모리를 확보했다면, 변수를 이용한 경우와 달리 이 주소를 사용하여 메모리에 직접 접근해야 한다.
즉, 확보한 메모리에 어떠한 값을 기억시킬 때에는 그 포인터를 사용하여 다음과 같이 대입힌다.
메모리를 동적으로 해제하기
동적으로 메모리를 확보했다면, 확보한 메모리가 더 이상 필요하지 않을 경우,
프로그램 작성자가 직접 메모리 해제를 지시해 주어야 한다. 로컬 변수나 글로벌 변수와 달리 메모리를 해제시키는 시점을 우리가 결정해야 한다. 동적으로 확보한 메모리를 해제하려면 다음과 같은 방법을 사용하면 된다.
delete 포인터 명;
메모리의 이용이 끝난 시점에
라는 코드를 반드시 적어야 한다. 물론 이미 해제된 메모리에는 delete 연산자를 사용할 수 없다.
동적으로 확보한 메모리를 해제하지 않으면 프로그램을 실행할 때마다 메모리가 확보되므로 사용할 수 있는 메모리가 부족하게 된다. 동적으로 메모리를 확보하고 해제하면 지정된 시점에 메모리를 사용할 수 있게 된다.
-동적 메모리는 코드의 필요한 부분에서 new연산자를 사용해서 확보하고, 사용이 끝나면 delete 연산자로 해제시킨다.-
배열을 동적으로 확보하기
동적으로 메모리를 확보하는 방법은 배열을 다룰 때 특히 요긴하게 사용된다. 프로그램 실행 시(런타임) 배열의 크기를 지정하여 처리할 수 있기 때문이다.
배열의 요소 수를 모르는 경우에 배열의 크기를 크게 잡을 수 밖에 없다. 그러나 배열을 동적으로 확보하게 되면 불필요하게 큰 배열을 준비하지 않아도 된다. 다음이 배열을 동적으로 확보하는 구문이다.
포인터 명 = new 형명[요소 개수];
이 경우 또한 배열의 이용이 끝나면 메모리를 해제해 주어야 한다. 이 때에는 다음과 같이 [ ]를 붙여서 해제한다.
delete[ ] 포인터 명;
실제 코드를 통해 배열의 메모리를 동적으로 확보해 보자.
이 코드에서는 시험 점수를 저장하기 위한 배열의 요소의 개수가 정해져 있지 않다. 요소의 개수는 사용자가 키보드로 입력한 인원 수로 결정되기 때문이다. 이처럼 입력된 인원 수만큼 배열을 동적으로 확보하게 되면, 대량의 배열을 준비할 필요가 없어지므로 메모리의 낭비를 예방할 수 있다.
-프로그램 실행 시에 배열의 크기를 결정해야 된다면 배열을 동적으로 확보한다.-
로컬 변수와 함수의 인수에 확당하는 메모리 영역은 스택이라고 한다.
전역 변수 등의 정적 변수에 할당하는 영역은 정적 메모리 영역, 동적으로 할당하는 메모리 영역은 동적 메모리 영역(힙) 이라고 한다.
C++ 에서는 어떠한 메모리 영역도 가리키지 않는 포인터를 'nullptr' (널 포인터)라는 키워드로 나타낼 수 있다.
'C++ 코딩 > C++ 기초개념' 카테고리의 다른 글
<C++ 기초> 식과 연산자, 연산자의 종류와 우선순위 (0) | 2021.02.23 |
---|---|
<C++ 기초> 동적배열, sti vector, 멤버함수 (0) | 2021.02.18 |
<C++ 기초> typedef, 열거형 enum (0) | 2021.02.16 |
<C++ 기초> 문자열 조작하기 -char[], string (0) | 2021.02.15 |
<C++ 기초> 변수와 스코프(지역변수와 전역변수) 02.14 (0) | 2021.02.14 |
<C++ 기초> 메모리 구조 힙, 스택, 데이터, 코드 (0) | 2021.02.09 |
<C++ 기초> 배열에 대한 이해, 문자열과 배열, char 02.08 (0) | 2021.02.08 |
<C++ 기초> 포인터와 레퍼런스(* , &) 02.04 (0) | 2021.02.04 |