Java

Java에는 다차원배열이 없다?!! (배열의 배열, 다중 배열)

Yeji Heo 2024. 1. 12. 21:38

Java처음 공부했을 때 '배열의 배열(다중 배열)'을 들어보긴 했는데,

공부를 제대로 안 했었는지.. '다차원 배열'개념이 Java에는 없다는 의미인 줄 몰랐다.

 

결론은 타 언어에서의 다차원 배열개념은 자바에서 '배열의 배열'으로 표현하는 것이 맞다고 한다.

지금부터 그게 대체 뭔 소린지 살펴보자 ! ! 


 

1. Java 다중 배열은 어떻게 생겼나?

 

다차원 배열이라고 하면, 아래와 같은 구조를 떠올릴 것이다.

1단 1단 첫번째 서랍 arr[0][0] 1단 두번째 서랍 arr[0][1] 1단 세번째 서랍 arr[0][2]
2단  2단 첫번째 서랍 arr[1][0] 2단 두번째 서랍  arr[1][1] 2단 세번째 서랍 arr[1][2]
3단 3단 첫번째 서랍 arr[2][0] 3단 두번째 서랍 arr[2][1] 3단 세번째 서랍 arr[2][2]

 

엥? Java도 그런 거 아냐? 놀랍게도 아니라고 한다. 

 

자바의 배열 구조는 위와 같은 Matrix구조가 아니고, 배열이 배열을 가지고 있는 구조이다. 

말로하면 어려우니 그림으로 보자.

 

 

1. int[] arr = new int[2] 는 자바에서 아래와 같이 표현된다

 

 

즉, arr[0]=10이라면 아래와 같은 위치에 10이 들어가게 된다.

 


 

2. int[][] arr = new int[2][3] 는 아래와 같이 표현된다.

이게 자바에서  int[2][3]를 표현하는 방법이다.

바로 배열이 배열을 가지고있는 다중 배열구조.

말하자면 arr[0]과 arr[1]이 각각 크기3의 배열을 가지는 것.

 

 

그러니까 arr[0][1] = 123 이라면

 

이 위치에 123이 저장되는 것이다.

 


 

 

3. 만약 같은 예시( arr[0][1] = 123 )를 다차원배열로 생각한다면 아래와 같을 것이다.

그러나 Java에서는  이러한 Row&Column의 Matrix구조가 아니다.

왜 그렇냐고? 그걸 증명할 수 있는 사례가 있다. 


 

2. 왜 Matrix구조가 아니라는 거?

 

그 구조로는 아래의 코드가 설명이 안 되기 때문.

코드를 살펴보자.

public class JavaArrayIsNotMatrix
{
	public static void main(String[] args) 
	{
		int[][] arr = new int[6][];
		arr[0]=new int[1];
		arr[1]=new int[2];
		arr[2]=new int[3];
		arr[3]=new int[4];
		arr[4]=new int[1];
		arr[5]=new int[1];

		int value = 0;

		for(int i=0;i<arr.length;i++){                         
			for(int j=0;j<arr[i].length;j++){
				arr[i][j]=value;
				value++;
			}//end of inner for
		}//end of outer for


		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr[i].length;j++){
				System.out.println(arr[i][j]);
			}//end of inner for
			System.out.println("-------");
		}//end of outer for

	}//end of main
}//end of class

가령, int[6][] 이렇게 선언했다면.

이후에 각각 크기(다차원 배열로 따지면 column)를 할당한다면.

심지어 그 크기가 다르다면?

 

우선 declaration 및 assignment을 한대로 그림을 그려보자.

 

일단은 여기까지만 그릴 수 있다.

화살표 밑으로는 각각이(arr[0], arr[1], ...) 어느 길이만큼의 배열을 가질지 모르기 때문이다.

 

그러니까 이제 마저 할당을 해줘보자

Java에서는 보다시피 arr[0], arr[1]의 길이가 다를 수 있다. 

배열의 배열!

각 배열이 가진 배열은 서로 크기가 다를 수도 있겠지! 그러면 안될 이유가 없잖아??

확인을 해보면, 할당한대로

arr[0]의 길이 1, arr[1]의 길이 2, arr[2]의 길이 3,  arr[3]의 길이 4, arr[4]의 길이1, arr[5]의 길이1

임을 문제없이 확인할 수 있다.

 

결론!

배열구조를 다차원배열 매트릭스로 표현하는 것이 이해하기에는 편하겠지만, 사실 Java에서의 구조는 그게 아니라는 거! 

앞으로는 Java 억울하게 다차원배열이라고 표현하지 말자!! 다중 배열, 배열의 배열!!


 

 

+ 오늘도 약간의 여담...

 

요즘 Java를 공부하면서 Java의 철학을 같이 배우게 된다...

이 철학들이 코딩에도 그대로 녹아드는 것이 너무 신기하다. 

 

정확히는 모르겠지만 예를 들면,

첫째, while(0) 이렇게 '조건'부분을 0이나 1로 표현하면 에러나는 거.

=> 0이 false고 1이 true인 건 C처럼 제법 저수준적(Low level)인 사고이므로

사람에게 더 직관적인, 고수준을 추구하는 Java에서는 true/false로 표시하는 점

 

둘째, 실세계를 시스템으로 표현하기 위한 객체지향, 자연과도 같아서

인위적인 break;나 continue;가 쓰일 일이 은근 없는 것

 

뭐 이런 건 팩트인지는 모르겠지만.. 어찌됐든 하고싶은 말은 이거다.

미래에 어떤 언어로 개발하더라도,

그 언어의 역사부터 모든 것들이 '왜?'이렇게 표현되는지/동작하는지

관심을 가지고 공부하다보면 

점점 더 그 언어에 '어울리는' 코딩을 할 수 있을 거 같다.