-
Java에는 다차원배열이 없다? (배열의 배열, 다중 배열)Java 2024. 1. 12. 21:38
Java를 처음 공부할 때 '배열의 배열(다중 배열)'을 들어본 적이 있을 것이다.
이번 글에서는 Java에서의 다차원 배열 개념에 대해 정리해보려고 한다.
C언어에서의 다차원 배열개념은 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;가 쓰일 일이 은근 없는 것
어찌됐든 하고싶은 말은 이거다. 미래에 개발자로서 어떤 언어로 개발을 하게 되더라도, 그 언어의 역사부터 모든 것들이 '왜?'이렇게 표현되는지/동작하는지에 관심을 가지고 공부하다보면 점점 더 그 언어에 '어울리는' 프로그래밍을 할 수 있을 거 같다.
'Java' 카테고리의 다른 글
Java 모든 Class는 Object Class를 상속 받는다(feat. 오버라이딩) (0) 2024.01.19 Garbage collection을 고려한 코드 작성 (1) 2024.01.19 static 메서드 호출 시 주의점 (0) 2024.01.19 Java 환경 변수 설정(하는 이유, 과정 분석!) (1) 2024.01.11 Java는 플랫폼 독립적이다? (1) 2024.01.11