[C++] 04 배열

김진우·2025년 5월 12일

C++

목록 보기
4/16
post-thumbnail

정의

같은 자료형의 데이터를 연속된 메모리 공간에 저장하는 자료구조이다.

배열은 메모리 상에서 연속된 공간을 차지하게 되는데, 배열의 각 요소는 해당 자료형의 크기만큼 일정한 간격을 두고 영역이 할당된다.

배열의 활용

  • 동일한 타입의 많은 데이터를 한 번에 관리해 할때
  • 반복문과 결합하여 데이터를 순차적으로 처리할 때
  • 인덱스를 통한 데이터 접근이 필요할 때

사용방법

1. 선언

배열은 자료형, 배열 이름, 크기로 선언이 된다.
배열의 크기는 대괄호로 감싸서 지정을 한다.
선언과 동시에 값을 초기화 하고 싶을 경우 중괄호에 값을 담아 지정할 수 있다.

int arr[5];
int arr2[5] = {1,2,3,4,5};
int arr3[] = {10, 20, 30};

배열의 크기는 선언 시 정해져야 되고, 값이 할당되지 않으면 각 요소는 임의의 값(쓰레기 값)이 들어갈 수 있다.

배열을 선언할 때 메모리에는 배열에 사용될 자료형의 크기 x 배열의 크기 만큼의 공간이 할당 되며 배열 내의 원소는 각각 자료형의 크기 만큼의 메모리 공간을 할당받게 된다.
배열 내의 첫 원소가 배열의 시작 주소가 된다.

2. 접근

2-1. Index를 통한 접근

배열의 이름 뒤 대괄호 안에 index 값을 넣어 임의의 원소에 접근 가능하다.

arr[2] = 10;

배열의 크기가 n일때, 배열의 요소는 0부터 시작되고 n-1까지 사용 가능하다.
배열의 크기를 넘어가는 index를 사용할 경우 예상치 못한 결과를 가져올 수 있으므로 사용에 유의해야 한다.

2-2. 주소를 통한 접근

배열은 각 원소들이 메모리상 연속된 공간에 할당 되어있기 때문에 메모리 주소 연산을 이용해 공간을 참조할 수 있게 된다.

*(a+2) = 10;

이때, 배열의 시작 주소인 a에 +2 연산을 했는데 배열의 주소를 출력해보면 메모리상에서는 훨씬 많은 주소가 지나간 것을 알 수 있다. 이것은 앞서 설명했듯이 배열 내의 원소는 자료형의 크기 만큼의 주소가 할당 되어 있기 때문에 배열의 접근에서도 자료형의 크기만큼 구성 요소의 주소를 건너뛰게 되는 것이다.

주소를 통한 접근에서도 마찬가지로 배열의 크기를 넘어갈 경우 예상치 못한 결과를 가져올 수 있으므로 사용에 유의해야 한다.

컴파일러 관점의 접근

a[3] = 10;*(a+2)=10;은 우리가 보기에 동일한 동작을 한다. a의 3번째 원소에 접근해 10의 값을 저장한다. 하지만, 이 코드를 실행하기 위해 코드를 기계어로 해석하는 컴파일의 과정을 거치는데, 컴파일러가 이 코드를 해석하는 경우에 어떻게 처리가 될지 알아보자.

배열도 하나의 변수로 볼 수 있는데 메모리상에는 변수가 변수명으로 저장되지 않고 메모리상의 주소로 기억이 된다. 따라서 컴파일러는 배열의 접근도 메모리 주소로의 접근으로 해석한다. 즉, 컴파일러는 내부적으로 *(a+2)=10;과 같은 형태로 코드를 해석하게 된다. 이것은 문법의 차이이고, 생성되는 어셈블리 코드가 동일하기 때문에 성능 차이는 존재하지 않게 된다. 따라서, 두가지 표현 방식중 어떤 것을 사용해도 코드가 동일하게 동작한다.

0개의 댓글