/
정적 배열이란?(Static array)

일반적으로 우리가 선언하는 배열은 컴파일하는 시점에 크기가 정해지는 배열입니다.

예를 들어서 아래와 같은 코드가 있는 경우에는 컴파일 시점에 arr이라는 배열의 크기가 정해집니다.

#include <array>
#include <iostream> 
int main() { 
  std::array <int, 5> arr = {1,2,3,4,5}; 
  for(auto &element : arr) { 
    std::cout << element << " "; 
  } 
  std::cout << std::endl; return 0; 
}

 

위 코드에서 std::array를 사용하여 Type은 Int이고, 크기는 5인 배열을(arr) 선언하였습니다.

이때 생성된 배열의 크기는 컴파일이 될 때 정해지게 됩니다.

컴파일 시점에 크기가 정해지면 더 이상 변경이 될 수 없는데요, 이것을 정적(static) 배열이라고 합니다.

배열을 선언해두고 사용하다 보니 추가적인 공간이 필요하게 돼버리는 경우에는 문자열 처리 등.. 기능을 제대로 못하게 되는 경우가 발생하기도 하더라고요,

그래서 저의 경우에 static array을 사용할 때는 크기를 다시 수정할 수 없으니, 필요한 만큼만 딱 정해서 쓰기보다는 약간의 여유를 둬서 크기를 잡아두고 사용합니다. char buf[64]; char buf[128]; .. 이런식으로요.

하지만 필요할 때 마다 크기를 바꿀 수 있다면 더욱 편하겠죠?

동적 배열이란?(Dynamic array)

동적 배열이란 Program이 실행되는 run time에 크기를 자유 자재로 변경할 수 있다는 것을 의미합니다.

C/C++에서 동적으로 배열을 사용하고자 할 때는 new(또는 malloc) 키워드를 사용하여 새롭게 메모리를 할당하여 사용할 수 있습니다.

아래 코드처럼 필요한 크기만큼 사용할 때마다 메모리를 받아서 쓰는 것입니다.

#include <iostream> 
int main() { 
  int size = 10; // 원하는 크기 만큼 사이즈를 정할 수 있음. 
  //std::cin >> size; 로 값을 입력 받는 것도 가능 
  std::cout << "Enter the size of the array: "; 
  //std::cin >> size; 
  
  *myArray = new int[size]; // 크기 만큼 myArray 포인터를 생성 int 
  
  for (int i = 0; i < size; i++) { 
    myArray[i] = 0; // 생성 후 0으로 초기화 
  } 
  
  // 생성된 배열을 사용힌디..
  delete[] myArray;  // 사용이 끝나고, main이 끝나는 시점에서 delete하여 할당된 메모리 삭제 
  return 0; 
  }

그러면 myArray는 크기가 10인 integer 배열이 되는 것입니다. 또한 이때 배열은 heap 영역에 할당되는 것을 볼 수 있습니다!

new() 키워드를 사용할 때 언제나 그렇듯 중요한 것은 delete를 꼭 적절하게 해주어 메모리 누수를 방지해야 한다는 것입니다.

항상 프로그램을 짜다 보면 delete가 되기 전에 종료되는 경우가 있기 때문에

이것을 방지하기 위해서 스마트 포인터를 사용하는 방법도 있고, 오늘 알아볼 std::vector 을 사용하는 방법도 있습니다.

std::vector를 사용하면 더욱 쉽게 동적으로 사용할 수 있고, 값을 push, pop 하는 것은 당연히 가능하고, resize() 함수를 통해서 배열의 크기를 변경하는 것이 가능합니다.

#include <iostream> 
#include <vector> // std::vector 사용하기 위해 include 필요 

int main() { 
  int size = 10; // 원하는 크기 만큼 사이즈를 정할 수 있음. 
  // std::cin >> size; 로 값을 입력 받는 것도 가능 
  //std::cin >> size; 
  std::cout << "Enter the size of the array: "; 
  
  
  std::vector<int> myVector(size, 0); // 크기 만큼 myVector vector를 생성하고, 0으로 초기화 
  
  // 생성된 벡터를 사용.. 
  
  // 사용이 끝나고, main이 끝나는 시점에서 delete할 필요 없이 자동으로 없어짐 
  
  return 0; 
}

메모리가 할당된 상태는 아래와 같습니다. 동일하게 Heap 영역에 동적으로 할당됩니다.

선언된 vector를 20만큼의 크기를 갖게 하려면 resize() 함수를 사용하면 쉽게 크기를 변경할 수 있습니다.

 myVector.resize(20); // myVector의 크기를 20으로 resize

20만큼의 메모리가 할당되는 것을 확인할 수 있습니다.

std::vector 간단 설명

코딩 샐러드의 C++ 배우기

제가 자주 사용하는 std::vector의 method는 5가지 정도입니다. 그중 제일 좋아하는 것은 앞서서 말했던 resize()입니다!

1) vector 크기 알아보는 것이 가능하다 : size()

std::cout << "Size of vector: " << myVector.size() << std::endl; // Output: 5

2) vector 크기를 새롭게 정하는 것이 가능하다 : resize(size)

myVector.resize(5); // myVector의 크기를 5로 재설정

 

3) vector에 새로운 값을 추가(push) : push_back(value)

myVector.push_back(4); // 벡터의 제일 마지막 위치에 새로운 값 (4)를 추가 한다

4) vector에 마지막 값을 삭제(pop) : pop_back(value)

std::vector<int> myVector = {1, 2, 3}; 
myVector.pop_back(); // 제일 마지막 값인 3을 제거

5) vector의 모든 값을 삭제 : clear()

std::vector<int> myVector = {1, 2, 3}; 
myVector.clear(); // 벡터의 모든 값을 제거

+ Recent posts