1. 2차원 배열

배열에 대한 또 하나의 흥미로운 사실. 배열은 1차원(선형)만이 아닙니다. 그들은 또한 2차원적일 수 있습니다.

그게 무슨 뜻입니까?

이것은 배열의 셀이 열(또는 행)뿐만 아니라 직사각형 테이블도 나타낼 수 있음을 의미합니다.

int[][] name = new int[width][height];

여기서 name 은 배열 변수의 이름이고 width 는 테이블 너비(셀)이고 height 는 테이블 높이입니다. 예:

int[][] data = new int[2][5];
data[1][1] = 5;
2열과 5행의 2차원 배열을 만듭니다.
셀 (1, 1)에 5를 씁니다.

이것이 메모리에 표시되는 방식입니다.

2차원 배열

그런데 2차원 배열에 대해 빠른 초기화를 사용할 수도 있습니다.

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

프로그래머로서 2차원 배열이 필요할 수 있는 곳이 너무 많습니다. 2차원 배열은 체스, 체커, 틱택토, 해전과 같은 거의 모든 보드 게임의 기초입니다.

2차원 배열 2

2차원 배열은 체스나 해전에 적합합니다. 셀 좌표에서 숫자만 필요합니다. '폰 e2-e4'가 아니라 '폰 (5,2) -> (5,4)'입니다. 프로그래머로서 훨씬 더 쉬울 것입니다.


2. 배열 요소 배열: (x, y) 또는 (y, x)

그런데 여기에 흥미로운 딜레마가 있습니다.

를 사용하여 배열을 만들 때 '2 5 new int[2][5]; ' 의 테이블이 있습니까 아니면 '2 5 '입니까? 그 반대의 경우, 먼저 높이와 너비?우리가 자주 말했듯이 여기에서는 모든 것이 그렇게 간단하지 않습니다.

배열이 메모리에 저장되는 방법 에 대한 질문부터 시작하겠습니다 .

물론 컴퓨터 메모리에는 실제로 행렬이 없습니다. 메모리의 각 위치에는 0, 1, 2, ...와 같은 순차적 숫자 주소가 있습니다. 우리의 경우에는 2 × 5 행렬에 대해 이야기하지만 메모리 그것은 단지 10개의 연속적인 셀일 뿐이며 그 이상은 아닙니다. 행과 열의 위치를 ​​나타내는 것은 없습니다.

"너비 x 높이"에 찬성하는 인수.

이 접근 방식을 지지하는 주장은 모든 사람이 학교에서 수학을 배우며 좌표 쌍이 'x'(즉, 가로축)로 쓰여진 다음 'y'(세로 차원)로 쓰여지는 것을 배운다는 것입니다. 그리고 이것은 단지 학교 표준이 아니라 수학에서 일반적으로 인정되는 표준입니다. 그들이 말했듯이, 당신은 수학으로 논쟁할 수 없습니다. 그렇습니까? 첫 번째 너비와 다음 높이?

"높이 x 너비"에 찬성하는 인수.

이 위치에 대한 흥미로운 주장도 있습니다. 2차원 배열의 빠른 초기화입니다. 실제로 배열을 초기화하려면 다음과 같은 코드를 작성할 수 있습니다.

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

당신은 아무것도 눈치 채지 못합니까? 우리가 이것을 가지고 있다면?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

코드에 데이터를 한 줄씩 쓰면 2개의 행과 5개의 열이 있는 행렬을 얻습니다.

결론

우리는 무엇을 말할 수 있습니까? 어느 것이 더 편리한지 결정하는 것은 귀하에게 달려 있습니다. 가장 중요한 것은 동일한 프로젝트에서 작업하는 모든 프로그래머가 동일한 접근 방식을 고수한다는 것입니다.

코드에 초기화된 2차원 배열이 많이 있는 프로젝트에서 작업하는 경우 거기에 있는 모든 것이 빠른 데이터 초기화를 기반으로 할 가능성이 높습니다. 즉, 표준 '높이 x 너비'를 갖게 됩니다.

운 좋게도 많은 수학이 관련되고 좌표 작업(예: 게임 엔진)이 포함된 프로젝트에 참여할 수 있는 경우 코드는 '너비 x 높이' 접근 방식을 채택할 가능성이 큽니다.


3. 2차원 배열 배열 방식

이제 2차원 배열이 실제로 어떻게 배열되는지 배우게 될 것입니다. 준비가 된?

2차원 배열은 실제로 배열의 배열입니다!

즉, 일반 배열의 경우 배열 변수가 배열 요소를 저장하는 컨테이너에 대한 참조를 저장하면 2차원 배열의 경우 상황이 약간 폭발합니다. 1차원 배열에 대한 참조를 저장하는 컨테이너에 대한 참조. 백 번 설명하는 것보다 한 번 실제로 보는 것이 좋습니다.

2차원 배열 배열 방식

왼쪽에는 2 차원 배열 개체에 대한 참조를 저장하는 2차원 배열 변수가 있습니다. 에서중간 에 셀이 2차원 배열의 행인 1차원 배열을 저장하는 2차원 배열 개체가 있습니다. 그리고 오른쪽에는 2 차원 배열의 행인 4개의 1차원 배열을 볼 수 있습니다.

이것이 2차원 배열이 실제로 작동하는 방식입니다. 그리고 이 접근 방식은 Java 프로그래머에게 다음과 같은 몇 가지 이점을 제공합니다.

첫째 , '컨테이너의 컨테이너'는 '행의 배열'에 대한 참조를 저장하므로 매우 빠르고 쉽게 행을 교환할 수 있습니다. '컨테이너의 컨테이너'를 가져오려면 두 개가 아닌 하나의 인덱스만 지정하면 됩니다. 예:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

이 코드를 사용하면 행을 바꿀 수 있습니다.

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
2차원 배열은





matrix[0]첫 번째 행에 대한 참조를 저장합니다.
참조를 교환합니다.

결과적으로 matrix배열은 다음과 같습니다.
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

2차원 배열의 셀을 참조하지만 배열 이름 다음에 하나의 인덱스만 지정하는 경우 셀이 일반 1차원 배열에 대한 참조를 저장하는 컨테이너 컨테이너를 참조하는 것입니다.