배열

동일한 데이터 타입의 값들을 연속된 메모리 공간에 저장하고, 하나의 이름으로 묶어서 관리하는 자료구조

왜 자바의 배열은 ‘동일한 데이터 타입’의 값만 배열로 저장할 수 있는가 ?

자바는 파이썬, 자바스크립트와 다르게 타입을 엄격하게 제한하는 언어이다. 자바는 컴파일 시점에 타입오류를 최대한 잡아내어 런타임에 발생할 수 있는 문제를 미연에 방지한다.

자바에서 int[] num; 과 같이 선언된 변수는 프로그램의 어느 곳에서든 int 타입의 묶음 을 보장한다. 안정적이고 예측가능한 코드를 작성할 수 있다.

보다 직접적인 이유는 성능과 메모리 효율성 때문이다. 자바에서 배열을 생성할 때, 예를들어 int[] num = new int[100] 식의 코드가 실행되면, 메모리에 int 타입(4바이트) 100개가 들어갈 수 있는 연속된 400바이트의 메모리가 할당된다.

// 힙 메모리
주소 0x100: arr[0] (4바이트)
주소 0x104: arr[1] (4바이트)
주소 0x108: arr[2] (4바이트)
...
주소 0x28C: arr[99] (4바이트)

배열은 인덱스를 통한 빠른 주소 계산을 위해 사용하는 자료구조 이므로 위와 같이 데이터가 연속적으로 배치되어 있을 때 매우 빠른 산술 연산 한번으로 주소를 계산할 수 있다. 예를들어 자바가 여러 타입의 데이터를 한 배열에 담을 수 있다고 가정하면,

[ 10(4바이트), 3.14(8바이트), "world"(24바이트), ... ]

arr[2] 의 위치를 찾으려고 할 때, arr[0]의 크기인 4 바이트, arr[1]의 크기인 8 바이트를 시작 주소에서 더해야만 arr[2]의 위치를 식별할 수 있다.

파이썬과 자바스크립트는 그럼 성능의 저하를 감수하고 배열을 사용하는가 ?

어느정도는 그렇다고 볼 수 있지만 두 언어의 배열은 자바의 배열과는 근본적으로 다른 자료구조이다. 이 두 언어는 실제 데이터 자체를 연속적으로 저장하는 것이 아니라, 실제 데이터를 가리키는 주소를 연속적으로 저장한다.

배열 자체에는 고정된 크기들의 주소값 들만 저장되므로 자바의 원시 타입 배열처럼 시작주소 + i * 주소값의 크기로 빠르게 계산할 수 있다.

이 과정에서 실제 데이터에 접근하기 위해 배열에서 주소를 찾고 → 그 주소를 통해 실제 값에 접근 하는 메모리의 간접 참조가 일어나게 되어 자바의 배열보다는 성능이 떨어질 수 있다.

배열을 생성하는 방법

int[] scores;
scores = new int[5];

int[] scores2 = new int[5]

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

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