기타

개발자들이 잘 못 이해하고 있는 C/C++ 배열의 의미

로밍맨 2023. 1. 26. 20:41
728x90
반응형

C/C++ 에서 배열을 처음 배우면, 이런 말을 많이 듣습니다.

"배열의 이름은 해당 자료형의 포인터 타입이다"

이게 무슨 소리냐 하면, 아래와 같이 arr 이라는 변수를 선언하면, arr 은 int* 타입이라는 것입니다.

int arr[5] = {1, 2, 3, 4, 5};

 

결론부터 말하자면 틀렸습니다. arr 은 int* 타입이 아닙니다.

다만, 워낙 많은 강사와 유튜버, 책 등에서 이렇게 설명하고 있기에 이게 다들 맞는 줄 잘 못 알고 있습니다.

저도 사실 처음에 이렇게 배웠고, 해당 명제가 틀렸다는 사실을 알기까지 꽤나 오랜 시간이 걸렸습니다.

 

그럼 int arr[5] 라고 선언하면, arr 은 무슨 타입일까요? int[5] 타입입니다.

풀어서 쓰자면 "int 타입이 5개 메모리 상에 연속적으로 존재하는 타입"입니다.

int* 타입은 int 타입의 주소를 저장하는 타입이고요.

 

sizeof 연산자를 이용하면 이러한 내용을 간단하게 확인할 수 있습니다.

sizeof 연산자는 매개변수로 변수명을 받는 경우, 해당 변수가 차지하는 메모리 공간의 크기를 반환합니다.

따라서 sizeof(arr) 을 하게 되면, (int 가 4 byte 라고 치면), 4 * 5, 즉 20을 반환합니다.

만일 arr 이 int* 타입이라면, 이는 분명히 64-bit 시스템에서는 8을 반환할 것입니다.

 

C 로 개발을 오래 하신 개발자 분들이라면, 다음과 같은 의문이 들 것입니다.

"나는 위와 같이 이해(오해)하고도 일(코딩)하는데 아무 문제가 없었는데, 왜 이 내용을 내가 알아야 하고 중요한 것인가?"

제가 설명을 드리기보다 아래와 같이 2차원 배열을 동적으로 직접 만들어 보시면 이해가 더 빠를 것입니다.

 

:::한 번 해보세요:::

사용자로부터 세로 길이를 입력받아 가로 4칸짜리 2차원 배열을 만듭니다.

다음과 같은 제약(?)사항을 만족해야 합니다.(사실 2차원 배열이므로 당연히 이러한 조건을 만족해야 합니다)

2차원 배열이므로 2차원 배열 전체가 연속된 메모리 공간에 있어야 합니다.

2차원 배열이므로 arr[1][3] 과 같이 각 항목에 쉽게 접근할 수 있어야 합니다.

728x90
반응형