본문 바로가기

Java

[Java] 2차원배열

전에 배웠던 배열은 단순히 순서대로 나열되어 있었습니다. 이를 1차원 배열이라고 하는데요.

이번에는 2차원 배열을 배워보겠습니다. 2차원 배열은 행과 열로 구성되어 있습니다.

아직 1차원 배열이 익숙하지 않은 분들은 먼저 게시글을 봐주세요!

 

 

java 배열 이해가 안된다고? 일단 들어와봐!

배열이 필요한 이유에 대해서 알아보기 위해서 학생의 점수를 출력하는 간단한 프로그램을 작성해보겠습니다. 만약 학생을 몇 명 더 추가해야 한다면 변수를 선언하는 부분과 점수를 출력하는

madeprogame.tistory.com

 

 

2차원 배열은 int[ ][ ] arr = new int [2][3]와 같이 선언하고 생성합니다.

그리고 arr[1][2]와 같이 사용하는데, 먼저 행번호를 찾고, 그 다음에 열 번호를 찾으면 됩니다.

은 영어로 row(로우)은 영어로 column(컬럼)이라 한다.

 

2차원 배열의 사용법은 [ ]가 하나 추가되는 것을 제외하고는 앞서본 1차원 배열과 같습니다.

 

그림의 배열에 들어가있는 데이터는 다음과 같습니다,

arr[행][열], arr[row][column]

arr[0][0] : 1
arr[0][1] : 2
arr[0][2] : 3
arr[1][0] : 4
arr[1][1] : 5
arr[1][2] : 6

 

 

코드를 통해서 2차원 배열의 사용법을 알아보겠습니다.

  • 이 코드는 2차원 배열을 만들고, 배열에 있을 1부터 6까지 순서대로 직접 입력한다.
  • 다음과 같은 결과를 만들기 위해 0행에 있는 0, 1, 2열을 출력한다. 
  • 그리고 다음으로 1행에 있는 0, 1 ,2열을 출력한다.

2차원 배열 - 리펙토링1

구조 개선 - 행 출력 반복

구조 변경

 

코드 구조를 보면 비슷한 부분이 반복된다.

//0행 출력
System.out.print(arr[0][0] + " "); // 0열 출력
System.out.print(arr[0][1] + " "); // 1열 출력
System.out.print(arr[0][2] + " "); // 2열 출력
System.out.println();
//1행 출력
System.out.print(arr[1][0] + " "); // 0열 출력 
System.out.print(arr[1][1] + " "); // 1열 출력
System.out.print(arr[1][2] + " "); // 2열 출력

 

코드를 보면 행을 출력하는 부분이 거의 같습니다.

차이가 있는 부분은 행에서 arr[0]으로 시작할지 arr[1]로 시작할지의 차이입니다.

 

다음과 같이 행(row)에 들어가는 숫자만 하나씩 증가하면서 반복하면 될 것 같다.

// row를 0, 1로 변경하면서 다음 코드를 반복
System.out.print(arr[0][0] + " "); // 0열 출력
System.out.print(arr[0][1] + " "); // 1열 출력
System.out.print(arr[0][2] + " "); // 2열 출력
System.out.println(); // 한 행이 끝나면 라인을 변경한다.

 

반복문을 사용해서 코드를 변경해보겠습니다.

  • for문을 통해서 행(row)을 반복해서 접근한다.
  • 각 행 안에서 열(column)이 3개이므로 arr[row][0], arr[row][1], arr[row][2] 3번 출력한다.
  • row = 0의 for문이 실행되면 arr[0][0], arr[0][1], arr[0][2]로 1 2 3 이 출력된다.
  • row = 1의 for문이 실행되면 arr[1][0], arr[1][1], arr[1][2]로 4 5 6 이 출력된다.

그런데 뭔가 아쉽죠? 더욱 유지보수가 쉽게 가봅시다!

  • for문을 2번 중첩해서 사용하는데, 첫번째 for문은 행을 탐색하고, 내부에 있는 두번째 for문은 열을 탐색합니다.
  • 내부에 있는 for문은 앞서 작성한 다음 코드와 같습니다. for문을 이용해서 열을 효과적으로 출력했습니다.
System.out.print(arr[row][0] + " "); // 0열 출력
System.out.print(arr[row][1] + " "); // 1열 출력
System.out.print(arr[row][2] + " "); // 2열 출력

 

2차원 배열 - 리펙토링2

구조 개선 - 초기화, 배열의 길이

 

이 코드를 보니 2가지 개선할 부분이 있습니다.

 

  1. 초기화 : 기존 배열처럼 2차원 배열도 편리하게 초기화 할 수 있다.
  2. for문에서 배열의 길이 활용 : 배열의 길이가 달라지면 for문에서 row < 2, column < 3 같은 부분을 같이 변경해야 한다. 이 부분을 배열의 길이를 사용하도록 변경해야한다. 배열이 커지거나 줄어들어도 for문의 코드를 변경하지 않고 그대로 유지해보자!

 

초기화

1차원 배열은 다음과 같이 초기화 한다.

{1, 2, 3}

 

2차원 배열은 다음과 같이 초기화 한다. 밖이 행이 되고, 안이 열이된다. 그런데 이렇게 하면 행열이 잘 안느껴진다.

{{1, 2, 3},{4, 5, 6}}

 

이렇게 라인을 이쁘게 넘겨주면 행과 열이 명확해지겠죠?

{
    {1, 2, 3},
    {4, 5, 6}
}

 

for문 에서는 2차원 배열의 길이를 활용했습니다.

  • arr.length는 행의 길이를 뜻한다. 여기서는 2가 출력된다.
  • { { } , { } }를 생각해보면 arr 배열은 { } , { } 2개의 배열 요소를 가진다.
  • arr[row].length는 열의 길이를 뜻한다. 여기서는 3이 출력된다.
  • arr[0]은 {1, 2, 3} 배열을 뜻한다. 이 배열에는 3개의 요소가 있다.
  • arr[1]은 {4, 5, 6} 배열을 뜻한다. 이 배열에는 3개의 요소가 있다.

이제 배열의 초기화 부분만 다음과 같이 변경하면 바로 적용된 결과를 확인할 수 있습니다.

나머지 코드도 변경하지 않아도 됩니다!

{
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

 

 

이번에는 배열에 직접 1, 2, 3 숫자를 적어서 값을 할당하는 것이 아니라, 배열의 크기와 상관없이 배열에 순서대로

1씩 증가하는 값을 입력하도록 변경해보겠습니다.

 

  • 중첩된 for문을 사용해서 값을 순서대로 입력한다.
  • arr[row][column] = i++ 후의 증감 연산자(++)를 사용해서 값을 먼저 대입한 다음에 증가한다.
  • 코드에서 int i = 1으로 i가 1부터 시작한다.

2차원 배열 선언 부분인 new int[2][3]new int[4][5] 처럼 다른 숫자로 변경해도 잘 동작하는 것을 확인할 수 있다.

 

'Java' 카테고리의 다른 글

[Java] 향상된 for문  (0) 2024.02.18
Java 너 도대체 뭐니?  (0) 2024.02.17
[Java] 배열 이래도 이해가 안된다고?  (0) 2024.02.15
[Java] Scanner  (1) 2024.02.14
[Java] 자동 형변환? 캐스팅?  (0) 2024.02.07