C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

여행을 개발하다

BackEnd/C++

Array(배열) - 1차원 배열의 동적할당

yhtragramming 2019. 5. 9. 16:10

안녕하세요!!

오늘 포스팅할 내용은 1차원 배열의 동적할당(Dynamic Allocation)입니다.

지난 포스팅에서는 1차원 배열의 정적 할당에 대해서 알아보았는데요.

정적 할당은 배열의 크기, 즉 메모리의 크기를 미리 정하고 사용하는 것이라고 설명드렸습니다.

하지만 프로그래밍에서는 배열의 크기를 정해서 쓰기보다는,

그 때 그 때 유동적으로 변동에서 사용해야 할 경우가 더 많겠죠?

이럴 때 필요한 것이 배열의 동적 할당입니다.

즉, 정적, 동적 할당의 차이는 프로그램의 시작 전에 메모리를 할당하느냐,

혹은 프로그램을 사용하면서 메모리를 할당하느냐로 정리해볼 수 있겠습니다.


1. 1차원 배열의 동적 할당-1 (new 사용하기)

1차원 배열의 동적 할당은 사용자가 얼마만큼의 메모리를 필요로 하는가에 따라 크기가 달라집니다.

이 말은 각 배열이 첫 변수가 저장되는 메모리의 시작 위치는 지정할 수 있으나,

배열의 마지막 인수가 저장될 메모리의 위치는 알 수 없다는 말과 일맥상통하죠?

그래서 앞서 포스팅했던 '포인터(pointer)'의 개념과 'malloc()' 메소드를 적절히 사용해야 합니다.

여기서는 2가지 방법을 소개할 예정인데, 그 중 첫 번째 방법을 먼저 살펴보도록 하겠습니다.

먼저 사용자로부터 몇 개의 인수를 갖는 배열을 선언해야 하는지 물어보겠습니다.

C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

사용자로부터 n이라는 숫자를 입력 받았다면, 이제 입력된 크기만큼의 메모리를 할당하면 됩니다.

만약 정수형 인수들을 5개 입력해야 한다면, 총 20바이트의 메모리가 할당이 되어야겠네요.

이를 C++에서는 다음과 같이 선언할 수 있습니다.

ary는 정수형 포인터 변수가 되며, 이는 배열이 시작될 처음 위치는 정해주는 역할을 합니다.

그리고 뒤에 인수로 받은 n의 크기만큼의 배열을 할당합니다.

C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

위 방법은 C++에서 제공하는 라이브러리에 포함되어 있기 때문에, 뒤에 '[n]'을 붙여줄 필요는 없습니다. 즉, 다음과 같이 코딩해도 무관합니다.

C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

간단히 예제를 통해 살펴보겠습니다.

사용자로부터 n을 넘겨받아 배열 ary에 저장시키고, 배열 ary의 모든 인수를 출력해보도록 하겠습니다.

C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

실행 결과, 제가 임의로 입력한 배열의 크기와 인수가 정상적으로 출력되었습니다.

C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

2. 1차원 배열의 동적 할당-2 (malloc 사용하기)

두 번째 방법은 malloc과 sizof함수를 사용인데, malloc은 C에서부터 넘어온 함수입니다.

이 함수를 사용하여 동적 할당을 하기 위해서는 'stdlib.h'헤더 파일을 반드시 포함해야 합니다.

malloc 함수를 사용할 경우 '(자료형*) malloc(sizeof(배열의 크기))'로 메모리를 할당해주면 됩니다.

malloc은 할당하고 싶은 메모리의 크기를 바이트 단위로 전달하면 그 크기만큼 메모리를 할당합니다.

단순히 메모리만 할당하기 때문에, 프로그래머가 어떤 자료형을 전달할지는 예측할 수 없습니다.

그래서 자료형을 명시해주고, 자료형의 크기를 넘겨줘야 합니다.

C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

다음과 같이 코딩하면, 위에서 new int[n]의 방법으로 코딩하는 것과 동일한 결과물을 얻을 수 있습니다.

C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

저 또한 공부하는 과정에서 malloc을 사용할 경우와 new를 사용했을 때의 차이점을 찾아보았습니다.

1. malloc은 할당할 메모리의 크기를 알아야 하지만, new는 알지 못해도 무관하다.

그러나 불필요한 메모리 누수가 발생할 수 있기 때문에 배열의 크기를 명시하지 못한 경우,

'delete'함수로 해제해주는 것이 좋습니다. 물론 다 사용하고요....

C++ 1차원 배열 동적할당 - c++ 1chawon baeyeol dongjeoghaldang

2. malloc은 생성자와 소멸자를 호출하지 않지만, new는 생성자와 소멸자를 호출한다.

아직 게시한 글에는 내용이 없지만, malloc은 생성자와 소멸자를 호출하지 않는 반면 new는 생성자와 소멸자를 통해 초기화까지 가능하다는 점이 중요한 차이입니다.


지금까지 1차원 배열의 동적 할당 방법에 대해 알아보았습니다.

감사합니다!!!