언어 및 도구들 공부/Java

Java에서의 배열과 메모리

Dr.Mlem 2024. 9. 22. 23:25

Q1.
모든 형태의 배열은 데이터 타입이 어떤 것이건 무조건 정수형 값을 저장할 수 있는 메모리 공간을 생성한다. 즉 모든 배열 자체의 메모리 크기는 4byte이다. 이 말이 무슨 말인지 잘 모르겠어. 맞는 말인지, 아니면 초심자들에게 이해하기 쉽게 비유한 말인지, 어떤 것일까?


 

이 말은 약간 오해를 불러일으킬 수 있는 설명입니다. 하나씩 천천히 설명해 볼게요.

배열의 메모리 구조와 크기

배열은 같은 데이터 타입의 값들을 연속된 메모리 공간에 저장하는 자료 구조입니다. 배열의 크기와 메모리 구조는 배열이 저장하는 데이터 타입에 따라 달라집니다.

예를 들어, 배열이 int형 정수를 저장한다면, 각 배열 요소는 4바이트(32비트)를 차지할 수 있습니다. 이는 C나 C++ 등의 언어에서 일반적인 int형 변수의 크기가 4바이트이기 때문입니다. 그러나 모든 배열이 4바이트 크기를 가진다는 것은 틀린 말입니다. 배열의 크기는 배열이 저장하는 데이터 타입에 따라 달라집니다.

데이터 타입에 따른 배열의 메모리 크기

  • int 배열: 각 요소는 4바이트를 차지함 (일반적인 32비트 시스템에서)
  • char 배열: 각 요소는 1바이트를 차지함
  • double 배열: 각 요소는 8바이트를 차지함

즉, 배열의 메모리 크기는 **배열의 요소 하나의 크기 × 배열의 길이(요소의 개수)**로 계산됩니다. 배열 자체가 4바이트라는 것은 사실과 다릅니다.

잘못된 설명일 가능성

초심자에게 쉽게 설명하려다 보니 다소 부정확한 정보가 포함된 것 같습니다. 실제로 모든 배열이 4바이트 크기의 메모리 공간을 차지하는 것이 아니라, 데이터 타입에 따라 배열의 크기는 달라집니다. 다만 int 배열의 경우 각 요소가 4바이트를 차지한다는 설명을 간단히 하려고 했을 가능성이 있습니다.

이해가 좀 더 되셨나요? 추가적으로 궁금한 부분이 있다면 물어보세요!



Q2.

배열에 대한 참조를 위해 사용되는 메모리 점유량과는 다를까?



좋은 질문입니다! 배열의 데이터가 차지하는 메모리 공간과, 배열을 참조하기 위해 사용하는 메모리 공간은 다릅니다. 이 차이를 하나씩 설명해 보겠습니다.

1. 배열이 차지하는 메모리 공간

배열이 차지하는 메모리 공간은 배열 요소의 데이터 타입과 요소의 개수에 의해 결정됩니다. 예를 들어, int형 배열이 있고, 10개의 요소가 있다면:

  • 각 int 요소가 4바이트를 차지하므로,
  • 배열은 10개의 요소 × 4바이트 = 40바이트의 메모리 공간을 차지합니다.

2. 배열의 참조 (포인터)와 메모리 점유

배열은 메모리에서 연속된 주소 공간에 데이터를 저장하지만, 프로그램에서 배열을 처리할 때는 배열의 시작 주소를 사용하여 참조합니다. 이 때 배열을 참조하는 변수(혹은 포인터)가 사용하는 메모리 공간은 배열의 크기와는 별개로, 보통 포인터 자체의 크기만큼 메모리를 차지하게 됩니다.

  • 포인터 크기는 시스템 아키텍처에 따라 달라집니다:
    • 32비트 시스템에서는 포인터 크기가 4바이트입니다.
    • 64비트 시스템에서는 포인터 크기가 8바이트입니다.

즉, 배열 자체는 그 요소에 따라 큰 메모리를 사용할 수 있지만, 배열을 참조하는 포인터는 비교적 작은 크기의 메모리를 차지합니다. 배열을 참조하는 포인터가 사용하는 메모리 크기는 배열에 저장된 데이터 크기와 무관하며, 시스템의 아키텍처(32비트 vs 64비트)에 따라 결정됩니다.

예시:

  • int형 배열 arr[100]가 있다고 가정하면, 이 배열은 400바이트의 메모리를 사용합니다 (100개의 int 요소 × 4바이트).
  • 하지만 배열을 참조하는 포인터 int* ptr는 64비트 시스템에서는 8바이트, 32비트 시스템에서는 4바이트의 메모리만 차지합니다.

결론:

배열을 참조하기 위해 사용되는 메모리 크기(포인터 크기)는 배열 자체가 사용하는 메모리와는 다릅니다. 배열 자체는 요소의 데이터 타입과 개수에 따라 메모리 크기가 달라지지만, 배열을 참조하는 포인터는 시스템의 아키텍처에 따라 고정된 크기의 메모리만을 사용합니다.

혹시 이 부분에서 더 궁금한 점이 있으신가요?

===종료===