배열을 생성하려면 통상 3가지 단계를 거치게 된다.

 

  1. 선언 - 배열에 대한 참조를 생성한다.
  2. 배열의 인스턴스화 - 배열을 생성한다.
  3. 초기화 - 배열의 셀에 값을 할당한다.

이를 단계별로 자세히 알아보자.

 

1. 선언(Declaration)

배열에 대한 참조 변수를 생성한다.
이 때 실제 배열 객체는 메모리에 생성되지 않는다. 선언은 타입과 배열을 나타내는 대괄호([]), 그리고 참조 변수 이름으로 구성된다.

int[] arr;

 

메모리에는 아직 배열은 할당되어있지 않다.

2. 인스턴스화(Instantiation)

new 키워드와 함께 배열의 실제 메모리 공간을 할당한다.
배열의 각 요소는 자동으로 해당 타입의 기본값으로 초기화된다. (예를 들어, int 타입의 배열 요소는 0으로 초기화된다).

이 과정에서 배열의 첫 번째 요소([0])에 해당하는 물리적 메모리 주소가 참조 변수에 저장된다.

int[] arr;
arr = new int[3];

2-1 왜 배열은 0부터 시작을 할까?

컴퓨터는 배열의 첫 번째 요소의 메모리 주소를 참조하여 시작점으로 삼는다. 이 주소를 '기준 주소(base address)'라고 부르며, 배열의 다른 요소들은 이 기준 주소로부터의 상대적 위치(offset)로 찾을 수 있다.


즉, 기준점(0)으로 위치를 계산하기 때문이다.

물리주소를 가진 첫번째 요소를 기준으로(본인이기 때문에 0) 계산한다.

3.초기화(Initialization)

배열의 각 요소에 구체적인 값을 할당한다.
이 과정은 명시적으로 각 요소에 값을 할당하거나, 배열 선언과 동시에 값을 초기화하는 문법을 사용하여 진행할 수 있다.

//순차적으로
int[] arr;
arr = new int[3];
arr[0] = 10;
arr[1] = 10;
arr[2] = 10;

//한번에
int[] arrAtOnce = {10,10,10};

3-1 재미있는 사실 : 순차적으로 초기화하느냐, 한번에 초기화하느냐에 따라서 성능이 달라진다?

순차적으로 초기화할 때는 각 배열 요소에 대해 값을 하나씩 할당해야 하므로, 요소의 개수에 비례해서 시간이 소요된다. 

 

반면에 일괄 초기화 구문을 사용하면 순차적 초기화와 초기화 방식은 같지만, 컴파일러나 런타임 환경에 따라 좀 더 최적화를 해주기때문에 성능이 조금 더 빨라진다. 이는 배열의 크기가 커지면 커질수록 성능의 차이가 벌어지게 된다.

+ Recent posts