Codegym University 과정의 일부로 멘토와 함께하는 강의 스니펫. 전체 과정에 등록하십시오.


"안녕하세요, 아미고!"

"안녕, 리시!"

"당신은 이미 배열에 대해 한두 가지 알고 있고 일부 작업을 해결하기까지 했습니다. 하지만 모든 것을 알지는 못합니다. 예를 들어 여기 배열에 대한 또 다른 흥미로운 사실이 있습니다. 배열은 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차원 배열은 배열의 배열과 같은 건가요?"

"정말 똑똑한 학생이군요! 맞습니다. 첫 번째 요소는 1차원 배열 {31, 28, 31}이고 두 번째 요소 {30, 31, 30}는 입니다. 하지만 이 단원의 뒷부분에서 다시 다루겠습니다. 그때까지 생각해보세요. 각 교차점에서 셀을 형성하는 행과 열이 있는 테이블로서의 2차원 배열.

"그것에 대한 마음속의 그림이 있습니다. 그런데, 이 2차원 배열은 무엇에 사용됩니까?"

"프로그래머는 2차원 배열이 매우 자주 필요합니다. 자세히 보면 체스, 체커, 틱택토, 해전 등 거의 모든 보드 게임이 기성품 2차원 배열을 사용하여 구현됩니다."

해전

"알았다! 체스나 해전의 경기장은 2차원 배열에 완벽하게 들어맞는다!"

"예, 하지만 셀 좌표로 숫자를 사용해야 합니다. 'pawn e2-e4'가 아니라 'pawn (5,2) -> (5,4)'입니다. 프로그래머로서 훨씬 더 쉬울 것입니다. "

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

"2차원 배열을 생성하면 흥미로운 딜레마가 발생합니다. 를 사용하여 배열을 생성할 때 '2 5 new int [2][5]; ' 테이블이 있습니까 아니면 '2열 5행' 테이블입니까?"

"즉, 너비를 먼저 지정한 다음 '높이'를 지정하는지... 아니면 그 반대로 먼저 높이를 지정한 다음 너비를 지정하는지 완전히 명확하지 않습니다."

"그래, 이게 딜레마야. 그리고 정해진 답은 없어."

"어떡해?"

"첫째, 2차원 배열이 실제로 어떻게 메모리에 저장되는지 이해하는 것이 중요합니다 . 당연히 컴퓨터 메모리에는 실제로 테이블이 없습니다. 메모리의 각 위치에는 0, 1, 2, ... 우리에게 이것은 2 × 5 테이블이지만 메모리에서는 10개의 셀에 불과합니다. 행과 열로 구분되지 않습니다."

"그건 이해했습니다. 그러면 너비와 높이 중 어떤 치수가 먼저 오는지 어떻게 결정합니까?"

"첫 번째 옵션을 고려해 봅시다. 폭이 먼저이고 높이가 그 다음 입니다. "이 접근 방식을 선호하는 주장은 다음과 같습니다. 모든 사람이 학교에서 수학을 배우고 좌표 쌍이 'x'(즉, 가로 축) 그런 다음 'y'(수직 치수). 그리고 이것은 단지 학교 표준이 아니라 수학에서 일반적으로 인정되는 표준입니다. 그들이 말했듯이, 당신은 수학으로 논쟁할 수 없다."

"그럴까요? 뭐, 싸울 수 없다면 폭이 먼저고 높이가 그 다음이겠죠?"

" 'height first, then width'를 선호하는 흥미로운 주장이 있습니다 . 이 주장은 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는 높이이고 5는 너비입니다... 그럼 어떤 옵션을 사용해야 할까요?"

"어떤 것이 더 편리한지 결정하는 것은 당신에게 달려 있습니다. 가장 중요한 것은 같은 프로젝트를 작업하는 모든 프로그래머가 같은 접근 방식을 고수한다는 것입니다."

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

"만약 당신이 많은 수학을 포함하고 좌표로 작업하는 프로젝트(예: 게임 엔진)에서 자신을 발견한다면 코드는 '너비 x 높이' 접근 방식을 채택할 가능성이 높습니다.

2차원 배열 배열 방법

"자, 수업 초반에 알아차렸던 2차원 배열의 특징을 기억하시나요?"

"예! 2차원 배열은 실제로 배열의 배열이었습니다!"

"맞아요." 즉, 일반 배열의 경우 배열 변수가 배열 요소를 저장하는 컨테이너에 대한 참조를 저장하면 2차원 배열의 경우 상황이 약간 폭발합니다. -array 변수는 1차원 배열에 대한 참조를 저장하는 컨테이너에 대한 참조를 저장합니다. 백 번 설명하는 것보다 한 번 직접 해보는 게 낫다."

2차원 배열 배열 방법

"왼쪽에는 2 차원 배열 객체에 대한 참조를 저장하는 2차원 배열 변수가 있습니다. 중간에는 이 1차원 배열을 저장하는 2차원 배열 객체가 있습니다. 2차원 배열의 행입니다. 그리고 오른쪽에는 2 차원 배열의 행인 4개의 1차원 배열을 볼 수 있습니다. 이것이 2차원 배열이 실제로 작동하는 방식입니다."

"환상적이야! 하지만 그것이 우리에게 주는 것은 무엇인가?"

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

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-차원에 대한 참조를 저장하는 컨테이너 컨테이너를 참조하는 것입니다. 차원 배열."

"모든 것이 논리적이고 명확해 보입니다. 강의 감사합니다, Rishi!"

"천만에요. 현명하게 실천하세요."