ABOUT ME

다음 섬으로 향하고자, 이번 섬을 기록하는 어느 개발자의 나침반

Today
Yesterday
Total
  • Java에는 다차원배열이 없다?!! (배열의 배열, 다중 배열)
    Java 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;가 쓰일 일이 은근 없는 것

     

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

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

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

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

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

Designed by Tistory.