2차원 배열

웃음인·2025년 4월 13일

Java

목록 보기
13/37
post-thumbnail

2차원 배열

자료형이 같은 1차원 배열의 묶음으로 배열 안에 다른 배열이 존재
2차원 배열은 할당된 공간마다 인덱스 번호 두 개 부여(앞 번호는 행, 뒷 번호는 열 ([0][0])

인덱스 값 이해


2차원 배열 구조

  • int [ ][ ] arr = new int [2][4]
    (heap 영역에 새롭게 2행 4열 int 2차원 배열을 할당(생성)


2차원 배열 선언과 할당

🔸 배열 선언

자료형[ ][ ] 배열명;
자료형 배열명 [ ][ ];
자료형[ ] 배열명[ ];

int[][] arr;
int arr[][];
int[] arr[];

//--> int 2차원 배열을 참조하는 참조변수 arr 선언
// 참조변수 == 참조형 == 래퍼런스 변수 == 래퍼런스

🔸 배열 할당

자료형[ ][ ] 배열명 = new 자료형[행크기][열크기]
자료형 배열명[ ][ ] = new 자료형[행크기][열크기]
자료형[ ] 배열명[ ] = new 자료형[행크기][열크기]

arr = new int[2][3];
// heap 영역에 int 2차원 배열 2행 3열 공간을 할당


2차원 배열 초기화

🔸 인덱스를 이용한 초기화

행, 열, 인덱스를 이용해서 직접 초기화

arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 10;

arr[1][0] = 40;
arr[1][1] = 50;
arr[1][2] = 60;

🔸 for문을 이용한 초기화

int num = 10; // 배열 요소 초기화에 사용할 변수

// 배열 길이 
System.out.println(arr.length); // 행 길이
// arr이 참조하고 있는 2차원 배열의 행 길이

System.out.println(arr[0].length); // 열 길이
// arr[0]이 참조하고 있는 1차원 배열의 길이

System.out.println(arr[1].length); // 열 길이
// arr[1]이 참조하고 있는 1차원 배열의 길이



for(int row = 0; row < arr.length; row++) { // 행 반복 (0, 1)
	for (int col = 0; col < arr[row].length; col++) { // 열 반복
    	arr[row][col] = num;
        num += 10;
      
      
        /*   
        arr[0][0] = 10;
        arr[0][1] = 20;
        arr[0][2] = 10;

        arr[1][0] = 40;
        arr[1][1] = 50;
        arr[1][2] = 60;
        */
    }
}

// Arrays.toString(배열명)
// : 참조하고 있는 1차원 배열 값을 문자열로 반환
System.out.println("Arrays.toString() : " + Arrays.toString(arr);
                   
// Arrays.toString(배열명)
// : 참조하고 있는 배열의 실제 데이터가 나오는 부분까지 파고 들어가서 모든 값을 문자열로 반환
System.out.println("Arrays.deepToString() : " + Arrays.deepToString(arr);

▹ Arrays.toString()

  • 1차원 배열에 적합
  • 배열 요소가 객체(배열 포함) 인 경우, 해당 객체의 toString() 결과를 사용
  • 다차원 배열에는 부적합
int[] arr = {1, 2, 3};
System.out.println(Arrays.toString(arr));

// -> [1, 2, 3] 출력

int[][] arr2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.toString(arr2));

// -> [[I@6d06d69c, [I@7852e922]
// int[]는 객체이므로, 내부 배열의 toString() → 메모리 주소 형태 출력

▹ Arrays.deepToString()

  • 다차원 배열까지 재귀적으로 탐색
  • 내부 배열의 요소까지 사람이 읽기 쉬운 형태로 출력
  • 객체 배열 + 중첩 배열에 최적
int[][] arr2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(arr2));

// [[1, 2], [3, 4]]

☝🏻 언제 무엇을 써야 할까?

✅ 1차원 배열 → Arrays.toString()

✅ 2차원 이상 / 중첩 배열 → Arrays.deepToString()

❗ 로그·디버깅 시 다차원 배열이면 무조건 deepToString()


🔸 선언과 동시에 초기화

/*
2차원 배열 선언과 동시에 초기화
3행 3열짜리 정수형 2차원 배열 선언과 동시애
1~9까지 초기화
*/

// int[] arr = {1, 2, 3, 4};

int[][] arr = { {1, 2, 3},
 				{4, 5, 6},
  				{7, 8, 9} };

// 행 별로 합 출력
// 0행의 합 : 6
// 1행의 합 : 15
// 2행의 합 : 24

for(int row = 0; row < arr.length; row++) { // 행 반복
	int sum = 0;
  
  for(int col = 0; col < arr[row].length; col++) { // 열 반복
  	sum += arr[row][col];
    //			0    0	 -> 1
    //			0    1	 -> 2
    //			0    2	 -> 3
    // ---------------------- 0행 합은 : 6
    //			1    0	 -> 1
    //			1    1	 -> 2
    //			1    2	 -> 3
    // ---------------------- 1행 합은 : 15
    //			2    0	 -> 1
    //			2    1	 -> 2
    //			2    2	 -> 3
    // ---------------------- 2행 합은 : 24
    
 	 }
     System.out.println("%d행의 합 : %d\n", row, sum);
   }
   System.out.println("==========================");

    /*
    열 별로 합 출력
    ex) 0열의 합 : 12
        1열의 합 : 15
        2열의 합 : 18
    */

	for(int col = 0; col < arr[0].length; col++) { // 각 열을 순회
       int sum = 0; // 현재 열의 합을 저장할 변수
      
      
      for(int row = 0; row < arr.length; row++) { // 각 행을 순회
          sum += arr[row][col];
          //			0    0	 -> 1
          //			1    0	 -> 4
          //			2    0	 -> 7
          // ---------------------- 0행 열은 : 12
          //			0    1	 -> 2
          //			1    1	 -> 5
          //			2    1	 -> 8
          // ---------------------- 1열 합은 : 15
          //			0    2	 -> 3
          //			1    2	 -> 6
          //			2    2	 -> 9
          // ---------------------- 2얄 합은 : 18
      }  
      System.out.println("%d열의 합 : %d\n", col, sum);
   }
}


가변 배열

다차원 배열 생성 시 마지막 배열차수(열)의 크기를 지정하지 않고
나중에 서로 크기가 다른 1차원 배열을 생성해 참조하는 배열

🔸 가변 배열 할당 (2차원 가변 배열)

자료형[ ][ ] 배열명 = new 자료형[행크기][ ];

char[][]  arr = new char[4][];
// char 2차원 배열 생성 시 행 부분만 생성

arr[0] = new char[3]; // 0행에 3열짜리 1차원 배열을 생성하여 주소값 저장
arr[1] = new char[4]; // 1행에 4열짜리 1차원 배열을 생성하여 주소값 저장
arr[2] = new char[5]; // 2행에 5열짜리 1차원 배열을 생성하여 주소값 저장
arr[3] = new char[2]; // 3행에 2열짜리 1차원 배열을 생성하여 주소값 저장

char ch = 'a';

for(int row = 0; row < arr.length; row++) {
	for(int col = 0; col < arr[row].length; col++) {
    	arr[row][col] = ch++;
    }
 }
System.out.println(Arrays.deepToString(arr));
}

🔸 가변 배열 구조

0개의 댓글