케네스로그

[Java] 배열의 선언과 메모리 할당 본문

Dev/Java

[Java] 배열의 선언과 메모리 할당

kenasdev 2022. 1. 30. 12:23
반응형

배열이란?

배열은 같은 타입의 데이터를 연속적으로 저장한 자료구조입니다. 배열의 특징은 '정적'이라는 점과 '연속적'이라는 것이죠. 정적이라는 말은 처음 배열의 크기가 정해지면 크기를 변경할 수 없음을 뜻합니다. 연속적이라는 건 메모리 상에서 배열의 첫번째 요소는 두번째 요소와 연이어 붙어있다는 것을 말합니다. 즉, 모든 요소들이 저장된 위치는 연속적으로 붙어있습니다.

 

배열의 생성

int[] a = new int[4];

배열을 만들기 위해 new 키워드를 사용합니다. 위의 코드예시와 같은 int[] a = new int[4];와 같은 형식입니다. 이를 풀어서 이야기하자면, "4개의 정수를 저장할 수 있는 배열 객체를 만들고, a라는 reference type 변수에 저장하라"는 것입니다. 따라서, array객체는 힙 메모리에서 생성될 것입니다.

 

다차원 배열과 메모리 공간

컴퓨터의 메모리 공간은 격자식으로 시각화할 수 있습니다. 각 격자(cell)은 메모리 상에 데이터를 저장할 수 있는 한 공간이라고 할 수 있으며, 각 격자는 주소를 지닙니다. 컴퓨터는 랜덤으로 메모리의 공간에 할당합니다.

 

int[] nums = new int[4] {1,2,3,4};

1차원 정수형 배열을 생성하고, 4개의 정수를 이용해 초기화했습니다. 메모리상에는 다음과 같이 저장될 것입니다. 각 원소가 연속적으로 저장되는 것이죠.

 

int[][] nums = {{1,2,3,4},{2,4,6,8}};

 

위의 코드처럼, 2차원 배열을 선언해서 크기가 4인 1차원 배열을 각각 저장했습니다. 메모리 상에서는 다음과 같이 저장될 것입니다.

 

int[][][] scores = {{{-1,-2,-3,-4},{-2,-4,-6,-8}},{{1,2,3,4},{2,4,6,8}}};

3차원 배열을 나타내면 위와 같습니다. 오른쪽 그림처럼 선언된 배열 자체는 한개의 객체(1차원 배열)로 이루어져 있지만,

 

scores[0], scores[1]

위의 그럼치럼, 2개의 배열로 이루어져있습니다. 즉, 2*4크기의 배열이 2개 있는 것이죠.

 

scores[0][0], scores[0][1]
scores[1][0], scores[1][1]

 

위의 각 배열은 또다시 2개의 배열들로 이루어집니다. 즉, 크기가 4인 배열 4개가 2개의 배열에 의해 저장된 것입니다.

 

scores[0][0][0], scores[0][0][1], scores[0][0][2], scores[0][0][3]

scores[0][1][0], scores[0][1][1], scores[0][1][2], scores[0][1][3]

scores[1][0][0], scores[1][0][1], scores[1][0][2], scores[1][0][3]

...

scores[1][1][0], scores[1][1][1], scores[1][1][2], scores[1][1][3]

가장 하위 차원으로 내려오면 4개의 정수형 원소들입니다. 이것들이 모여 전체 배열을 구성하는 것이죠.

 

배열의 할당과 메모리 구조

배열의 할당과 메모리구조에 관해서는 이곳에서 자료구조 배열을 설명하면서 깊게 다루었습니다. 참조해주세요🙂

반응형