C나 C++에서는 문자열처럼 배열의 길이를 자동으로 알려주는 기능이 없기 때문에, 프로그래머가 직접 계산해야 하는 경우가 많습니다. 이 글에서는 배열의 길이(요소 개수)를 구하는 대표적인 두 가지 방법을 예제 코드와 함께 자세히 살펴보겠습니다.
방법 1 – sizeof 연산자 사용하기
가장 널리 쓰이는 방법은 sizeof 연산자를 활용하는 것입니다. sizeof는 메모리에서 차지하는 바이트 크기를 반환하므로, 전체 배열의 크기를 배열 요소 하나의 크기로 나누면 배열의 길이를 구할 수 있습니다.
다음은 C++에서 sizeof 연산자를 사용해 배열의 길이를 구하는 예제입니다.
예제 코드
#include <iostream>
using namespace std;
int main() {
int arr[5] = {4, 1, 8, 2, 9};
int len = sizeof(arr)/sizeof(arr[0]);
cout << "The length of the array is: " << len;
return 0;
}
실행 결과
The length of the array is: 5
코드 설명
변수 len에는 배열의 길이가 저장됩니다. 계산 과정은 다음과 같습니다.
sizeof(arr): 배열 전체의 크기를 바이트 단위로 반환합니다. int형이 4바이트라면 5개 요소이므로 20바이트입니다.sizeof(arr[0]): 배열의 첫 번째 요소 하나의 크기를 반환합니다. 즉, 4바이트입니다.- 20 ÷ 4 = 5이므로 배열의 길이인 5가 구해집니다.
핵심 코드는 아래와 같습니다.
int arr[5] = {4, 1, 8, 2, 9};
int len = sizeof(arr)/sizeof(arr[0]);
cout << "The length of the array is: " << len;방법 2 – 포인터 연산 사용하기
두 번째 방법은 포인터 산술연산(pointer arithmetic)을 이용하는 것입니다. 배열 이름에 대한 주소 연산을 활용하면 배열의 시작 주소와 끝 다음 주소의 차이로 길이를 구할 수 있습니다.
다음은 포인터를 사용해 배열의 길이를 구하는 예제입니다.
예제 코드
#include <iostream>
using namespace std;
int main() {
int arr[5] = {5, 8, 1, 3, 6};
int len = *(&arr + 1) - arr;
cout << "The length of the array is: " << len;
return 0;
}
실행 결과
The length of the array is: 5
코드 설명
&arr: 배열 전체를 가리키는 포인터입니다.*(&arr + 1): 배열 전체 크기만큼 건너뛴 위치, 즉 마지막 요소 바로 다음의 주소를 의미합니다.arr: 배열의 첫 번째 요소(시작 주소)를 가리킵니다.
따라서 두 주소의 차이를 구하면 그 값이 곧 배열의 길이가 됩니다. 핵심 코드는 다음과 같습니다.
int arr[5] = {5, 8, 1, 3, 6};
int len = *(&arr + 1) - arr;
cout << "The length of the array is: " << len;주의사항
위 두 방법은 모두 컴파일 시점에 크기가 정해진 정적 배열(스택 배열)에만 적용됩니다. 함수에 배열을 매개변수로 전달하면 배열이 포인터로 decay되어 sizeof로 원래 길이를 얻을 수 없으므로 주의해야 합니다. 또한 동적으로 할당한 배열(new, malloc)의 경우에도 이 방식으로 길이를 구할 수 없으며, C++에서는 std::vector나 std::array처럼 크기를 직접 제공하는 컨테이너를 사용하는 것이 더 안전하고 권장되는 방법입니다.