자바 기본 배우기 -다차원 배열에 대해-

1. 다차원 배열(multidimensional array)

 

2차원 이상의 배열

 

배열 요소로 또 다른 배열을 가지는 배열

 

2차원 배열은 배열 요소로 1차원 배열의 참조를 가진다

 

3차원 배열은 배열 요소로 2차원 배열의 참조를 가진다

 

 

 

3*3 배열이 stack에 전체 주소를 가지고, 그 주소를 따라가면... 3개 공간의 배열이 있는데..

 

각 공간에는 역시 어떤 1차원 배열의 주소를 가지며 그 주소를 따라가면.. 실제 값들을 가지는 1차원 배열이 있는...

 

 

2. 2차원 배열 선언

 

1) 타입[][] 이름: int[][] iArr

 

이 방법을 주로 사용함

 

2) 타입 이름[][]: int iArr[][]

 

3) 타입[] 이름[]: int[] iArr[]

 

 

3. 2차원 배열 생성

 

1) 배열의 이름 = new 타입[1차원 배열 개수][1차원 배열 크기];

 

이 방법으로 생성한다면.. 각 원소 배열의 크기가 "1차원 배열 크기"로 모두 동일하게 알아서 초기화시켜 생성해준다

 

 

 

2) 배열의 이름 = new 타입[1차원 배열 개수][];

 

2)의 경우가 조금 재밌는데 2차원 배열은 "1차원 배열들의 배열"

 

각 원소 배열의 크기가 서로 달라도 된다?

 

[[1,2],[2,3,4],[3,5,6,7]] 이렇게 구성해도 된다

 

파이썬도 되긴 하지... 알고리즘 풀다보니 갑자기 헷갈렸네;

 

먼저 int[][] arr = new int[3][];으로 생성한다면...?

 

 

각 원소 배열의 크기는 지정하지 않았으니... null이 들어가있다..

 

배열도 객체이므로 객체의 기본값인 null이 들어가있다

 

그리고 내가 갑자기 arr[0] = new int[4]; 이렇게 하면..?

 

0번째 원소가 크기 4인 배열을 가리키게 되겠지

 

 

 

4. 2차원 배열의 형태

 

물리적인 형태로는 다음과 같이 생김

 

각 원소가 또 하나의 배열을 가리키는 주소를 저장함

 

 

 

하지만 실제 사람들이 논리적으로 생각하는 형태는...

 

진짜 행렬같이 생겼을거다

 

 

5. 2차원 배열의 메모리

 

단순 변수, 1차원 배열, 2차원 배열의 경우에 대해 메모리 상황 비교

 

int a = 10;이라고 한다면? 

 

그냥 stack에 a라는 공간 생기고 10을 저장

 

 

이제 int [] arr = new int[4];라고 한다면?

 

stack에 arr이라는 공간이 생기고..  heap에 4개 크기의 공간을 가지는 정수형 배열이 생기면서.. 초기값은 모두 0으로 저장되어 있음

 

그리고 arr이 heap에 생긴 크기 4인 공간을 가리키는 주소를 저장하고 있다

 

 

2차원 배열의 경우는?

 

int[][] arr2 = new int[2][];라고 한다면?

 

arr2가 stack에 공간 생기고.. new int[2][];하면.. heap에 크기 2인 배열이 생기는데 각 원소는 null로 초기화되어 있다

 

정수형 배열을 담을거니까 객체인 배열의 초기값인 null을 저장

 

 

그리고 arr2[0] = new int[3];하는 순간... heap에 크기 3인 정수형 배열이 생기고 각 원소는 0으로 초기화되어 있다

 

그리고 arr2의 0번째에는 새로 생긴 정수형 배열을 가리키는 주소가 저장된다

 

 

마찬가지로 arr2[1] = new int[3];도 heap에 새로 크기 3인 정수형 배열 공간이 생기고... 각 원소는 0으로 초기화되어 있으며

 

arr2의 1번에는 새로 생긴 배열을 가리키는 주소를 저장

 

 

 

그리고 arr2[1][1] = 100; 하면.. arr2[1]로 접근하고.. 다시 arr2[1]의 1번인 arr2[1][1]에 접근해서 거기에 100을 넣어준다

 

 

 

6. 3차원 이상의 배열 형성

 

3차원 이상 배열도 똑같이 생각하면 된다.

 

주소를 저장하는 1차원 배열이 있고.. 각 주소를 따라가면 또 1차원 배열이 있고.. 그 1차원 배열에는 또 주소가 저장되어 있고..

 

그 주소를 따라가면 실제 값을 저장하는 1차원 배열이 있고..

 

 

n차원 배열은.. 각 원소가 n-1차원 배열을 가지고 

 

n-1차원 배열은..? 각 원소가 n-2차원 배열을 가지고

 

...

 

3차원 배열은..? 각 원소가 2차원 배열을 가지고

 

2차원 배열은..? 각 원소가 1차원 배열을 가지고..

 

1차원 배열은..? 각 원소가 0차원 스칼라를 가지는..

 

 

7. 2차원 배열의 탐색

 

어떤 x의 좌표가 (i,j)라면..?

 

해당 위치의 바로 위쪽은 (i-1,j)

 

아래쪽은 (i+1,j)

 

오른쪽은 (i,j+1)

 

왼쪽은 (i,j-1)

 

아 근데.. 이건 내가 생각하는 x,y 좌표랑 반대네

 

아무튼 이렇게 이동하는 이론.?을 델타 이동이라고 부름

 

 

대각선을 포함해서 8방향 탐색도 가능함

 

우상단은..? 오른쪽으로 1칸 가서 (i,j+1) > 위로 1칸 가서 (i-1,j+1)

 

우하단은..? 오른쪽으로 1칸 가서 (i,j+1) > 아래로 1칸 가서 (i+1,j+1)

 

좌상단은..? 왼쪽으로 1칸 가서 (i,j-1) > 위로 1칸 가서 (i-1,j-1)

 

좌하단은..? 왼쪽으로 1칸 가서 (i,j-1) > 아래로 1칸 가서 (i+1,j-1)

 

 

그리고 이렇게 2차원 배열 탐색에서 주의할 점은 전체 공간을 벗어나지 않도록 막아주는 if문 코드가 필요하지..

 

n*n 크기라면.. 파이썬 if dx <= n-1 and dx >= 0 and dy >= 0 and dy <= n-1: 이런거 했잖아

 

 

아무튼 나는 좌표가 (x,y)면 map[y][x]로 접근하잖아

 

내가 하는거랑 반대임

 

기준만 잘 잡으면 어떻게 해도 상관없지만

 

괜히 헷갈리니까 그냥 내가 생각하는 대로 계속 하자고

 

 

8. 연습문제

 

모든 2차원 배열의 원소 중에서 3의 배수의 개수와 그들의 합을 출력해보기

 

 

 

package java05.array;

public class Array06_problem3 {
	public static void main(String[] args) {
		
		int[][] arr = new int[5][5];
		
		arr[0] = new int[] {2,3,1,4,7};
		arr[1] = new int[] {8,13,3,33,1};
		arr[2] = new int[] {7,4,5,80,12};
		arr[3] = new int[] {17,9,11,5,4};
		arr[4] = new int[] {4,5,91,27,7};
		
		int count_value = 0;
		int sum_value = 0;
		
		for(int y=0;y<5;y++) {
			for (int x=0;x<5;x++) {
				
				if(arr[y][x] % 3 == 0){
					count_value += 1;
					sum_value += arr[y][x];
				}
			}
		}
		
		System.out.printf("3의 배수의 개수: %d\n",count_value);
		System.out.printf("3의 배수의 합: %d", sum_value);
	}
}

3의 배수의 개수: 6
3의 배수의 합: 87
TAGS.

Comments