Backend/Java

[Java] 2차원 Array(배열) + 가변 배열/ 선언,할당,초기화

Deeb 2021. 9. 2. 19:43

✍ 2차원 배열

1차원 배열: 자료형이 같은 변수의 묶음
2차원 배열: 자료형이 같은 1차원 배열의 묶음
 * - 2차원 배열은 각 칸마다 2개의 인덱스 번호를 부여 받는다. arr[][]: 자료형이 같은 1차원 배열의 묶음으로 배열 안에 다른 배열이 존재

2차원 배열은 할당된 공간마다 인덱스 번호 두 개 부여 (앞 번호는 행, 뒷 번호는 열 ([0][0]) )

참고) 배열 = 자료형이 같은 변수의 묶음

 

arr[m] [n]

m :행 줄 수  n : 열 한 줄에 있는 칸 수

 

arr[0][0]

arr[0][1]

arr[0][0]

 

 

ex)아파트 동 호수

 

1. 배열 선언

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

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

2차원 배열은 각 칸마다 2개의 인덱스 번호를 부여 받는다. 

arr[1][3] 앞에[1] == 행, [3] == 열

 

참고

int[][] arr;

arr = new int[2][3];

➡ Stack 메모리 영역에 int[][] (int2차원 배열)을 참조할 참조 변수 arr선언

 

//행의 인덱스 번호: 0, 1
// 열의 인덱스 번호 : 0, 1, 2

 

 

+그림추가

 

 

2차원 배열 참조 변수 == 1차원 배열 참조 변수의 묶음

arr[row].length 바깥 반복문에서 그 해당 행의 길이

 

arr 0번 행의 길이 : arr[0].length == 3

arr 1번 행의 길이 : arr[1].length == 3 -> 열의 개수

 

2차원 배열인데 행 열을 다 쓰지않고 행만 써도 길이를 알 수 있다. 

arr.length == 2 == arr이 참조하는 2차원 배열의 행의 개수

 

2차원 배열에서 행의 개수가 궁금하다면

arr.length

열의 개수가 궁금하다면

arr[행]

 


2. 배열 할당

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

int[][] arr = new int[3][4];
int arr[][] = new int[3][4];

할당을 두개해야한다. 

 

2차원 배열 구조

참고) string배열의 참조의 참조하는 구조와 비슷하다. 

 

각 행마다 다른 구조를 한다. 


3. 배열 초기화

👉 값이 10, 20, 30, 40, 50, 60으로 초기화

 

1) 인덱스를 이용하여 직접 초기화

arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 30;
		
arr[1][0] = 40;
arr[1][1] = 50;
arr[1][2] = 60;

 

2) for문을 이용한 초기화

for(int row = 0; row< arr.length; row++) { //0행,1행
	// arr.length == 행의 개수 == 2
	for(int col = 0; col<arr[row].length; col++) {
    	
        //1) 수식 이용
        // arr[row][col] = (row*30) + 10*col +10; 
				
		//단순하게 하는방법			
		arr[row][col] = num; //반복문을 돌면서 num에 값을 누적	
		num += 10; //num 값을 10씩 증가시킨다. 다음값에는 10이 누적된 값을 적용
	}
}

 

3) 2차원 배열 선언과 동시에 초기화

 

int[] tmp1 = {10, 20, 30}; //1차원 배열 선언과 동시에 초기화 (중괄호 안에 나열될 값을 순서대로 쓴다.)
int[] tmp2 = {40, 50, 60}; //1차원 배열 선언과 동시에 초기화 (중괄호 안에 나열될 값을 순서대로 쓴다.)
		
int[][] arr = {
		{10, 20, 30} , // ,를 붙여서 행 구분
		{40, 50, 60}
		};//1차원 배열 두개를 가져와서 묶었다

 

3-1) 출력 시 행, 열 역순으로 초기화

 

정방향 

10 20 30

40 50 60 

 

역방향 

60 50 40 

30 20 10

 

for(int row = arr.length -1; row>=0 ; row --) { //행 역순,  -1해주는 이유는 인덱스 번호는 543210이기 때문
			
	for(int col = arr[row].length-1; col >=0; col--) {
		System.out.print(arr[row][col]+ " "); //for문 방향을 바꿔서 --..?
	}
	System.out.println();
}

arr[row].length-1

// 참조하고있는 열의 배열이 0,1,2인데
// 역순으로 접근하기 위해서는 2부터 시작해야한다 => 행의 길이 -1

 


✍ 가변 배열

: 행의 개수는 정해져 있으나 열의 개수가 정해져 있지 않은 2차원 배열

 

1. 가변 배열 할당

int[][] arr = new int[4][]; // 열 개수 지정하지 x
		
	arr[0] = new int[3]; //0번 행에 3열짜리 1차원 배열 추가
	arr[1] = new int[4]; //1번 행에 4열짜리 1차원 배열 추가
	arr[2] = new int[5]; //2번 행에 5열짜리 1차원 배열 추가
	arr[3] = new int[2]; //3번 행에 2열짜리 1차원 배열 추가

 

int[][] arr = new int[4][]; // 열 개수 지정하지 x
		
		arr[0] = new int[3]; //0번 행에 3열짜리 1차원 배열 추가
		arr[1] = new int[4]; //1번 행에 4열짜리 1차원 배열 추가
		arr[2] = new int[5]; //2번 행에 5열짜리 1차원 배열 추가
		arr[3] = new int[2]; //3번 행에 2열짜리 1차원 배열 추가
		
		int num = 0; //0부터 1씩 순서대로 증가하며 배열 요소 초기화하는 변수
		
		for(int row =0; row<arr.length; row++) { //arr.length; ==4 행의개수
			for(int col = 0; col<arr[row].length; col++) { //각 행마다 열의개수 구하기 
				
				arr[row][col] = num++; // 증감연산자 후위연산 //대입 먼저하고 1증가해라
			
				System.out.printf("%4d", arr[row][col]);
			}
			System.out.println(); //행 변경 줄 바꿈
		}

 

 

반응형