본문 바로가기
Java/Java

2차원 배열) 가변 배열 (Jagged Array)란?

by 박채니 2022. 3. 11.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


가변 배열(Jagged Array)이란?

- 2차원 배열의 길이가 제각각인 2차원 배열

 

가변 배열 생성 방법

public void test1() {
	//1. 배열 생성 (2차원 배열 길이 지정X)
	int[][] arr = new int[3][];
		
	//2. 각각 배열 할당
	arr[0] = new int[5];
	arr[1] = new int[3];
	arr[2] = new int[10];
    
	//3. 값 대입
	int k = 1;
		
	for(int i = 0; i < arr.length; i++) {
		for(int j = 0; j < arr[i].length; j++) {
			arr[i][j] = k++;
		}
	}
		
	//4. 출력 (for-each이용)
	for(int[] ar : arr) {
		for(int n : ar) {
			System.out.print(n + " ");
		}
		System.out.println();
	}
}

@콘솔출력값
1 2 3 4 5 
6 7 8 
9 10 11 12 13 14 15 16 17 18

arr의 0번째 인덱스에는 5개의 공간, 1번째 인덱스에는 3개의 공간, 2번째 인덱스에는 10개의 공간을 할당해주었습니다.

for문을 이용하여 arr의 i번째 인덱스에는 k++한 값을 대입 해주었습니다.

 

for문을 이용할 수도 있지만 할당과 동시에 값 초기화도 가능합니다.

//할당과 동시에 값 초기화
arr[0] = new int[] {1, 2, 3, 4, 5};
arr[1] = new int[] {6, 7, 8};
arr[2] = new int[] {9, 10, 11, 12, 13, 14, 15, 16, 17, 18};

//출력
for(int[] ar : arr) {
	for(int n : ar) {
		System.out.print(n + " ");
	}
	System.out.println();
}

@콘솔출력값
1 2 3 4 5 
6 7 8 
9 10 11 12 13 14 15 16 17 18

 

그렇다면 메모리 구조는 어떻게 될까요?

배열 생성 차례대로 메모리 구조를 확인해보겠습니다.

 

① 배열 생성 시

//1. 배열 생성
int[][] arr = new int[3][];

행 성분의 1차원 배열만 생성이 되고, 열 성분은 할당 전이므로 null 값을 갖고 있게 됩니다.

 

② 각각 배열 할당

//2. 각각 배열 할당
arr[0] = new int[5];
arr[1] = new int[3];
arr[2] = new int[10];

static 제외한 이미지

각각 공간이 할당되면서 null값을 가지고 있던 행 성분의 값들도 각각의 주소값을 갖게 됩니다.

또한 값 대입 전이므로 int형의 초기값인 0이 입력이 된 상태가 됩니다.

 

③ 값 대입

//3. 값 대입
int k = 1;
		
for(int i = 0; i < arr.length; i++) {
	for(int j = 0; j < arr[i].length; j++) {
		arr[i][j] = k++;
	}
}

이렇게 각각 공간의 값이 대입 되게 됩니다.

 

메모리 구조 상으론 일반 2차원 배열과 크게 달라진 점은 없습니다.

 

 

다음과 같이 가변 배열을 생성하세요.
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15

public void test2() {
	int[][] arr = new int[5][];
		
	int k = 1;
	for(int i = 0; i < arr.length; i++) {
		arr[i] = new int[i+1];
		for(int j = 0; j < arr[i].length; j++) {
			arr[i][j] = k++;
			System.out.print(arr[i][j] + " ");
		}
		System.out.println();
	}
}

@콘솔출력값
1 
2 3 
4 5 6 
7 8 9 10 
11 12 13 14 15