Java에는 다차원배열이 없다?!! (배열의 배열, 다중 배열)
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;가 쓰일 일이 은근 없는 것
뭐 이런 건 팩트인지는 모르겠지만.. 어찌됐든 하고싶은 말은 이거다.
미래에 어떤 언어로 개발하더라도,
그 언어의 역사부터 모든 것들이 '왜?'이렇게 표현되는지/동작하는지
관심을 가지고 공부하다보면
점점 더 그 언어에 '어울리는' 코딩을 할 수 있을 거 같다.