-
[ch5 자바 배열] 2차원 배열 알아보기프로그래밍 언어/JAVA 2022. 6. 10. 11:20
2차원 배열의 선언
앞에서 포스팅한 배열은 1차원 배열인데, 2차원 이상의 배열, 다차원(multi-dimensional) 배열도 선언해서 사용할 수 있다. 메모리 용량이 허용하는 한, 차원의 제한은 없지만, 주로 1,2차원 배열이 사용되므로 2차원 배열만 잘 이해하고 나면 3차원 이상의 배열도 어렵지 않게 다룰 수 있다.
2차원 배열을 선언하는 방법은 1차원 배열과 같으나, 대괄호[] 하나가 더 들어간다.
선언 방법 선언 예 타입 [][] 변수이름; int [][] score; 타입 변수이름 [][]; int score [][]; 타입[] 변수이름; int[] score[]; 더보기3차원 이상의 고차원 배열의 선언은 대괄호[]의 개수를 차원의 수만큼 추가해 주기만 하면 된다.
2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용되며,
만일 4행 3열의 데이터를 담기 위한 배열을 생성하려면 아래와 같다.
int [][] score = new int[4][3]; //4행 3열의 2차원 배열을 생성한다.
위의 문장이 수행되면 4행 3열의 데이터, 모두 12개의 int값을 저장할 수 있는 공간이 마련된다.
2차원 배열의 인덱스
2차원 배열은 행(row)과 열(column)로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재한다. '행 index'의 범위는 '0~행의 길이-1'이고 '열 index'의 범위는 '0~열의 길이-1'이다. 그리고 2차원 배열의 각 요소에 접근하는 방법은 '배열이름[행index][열index]'이다. 만약 int [][] score = new int[4][3]; 이와 같이 배열 score를 생성하면, score[0][0]부터 score[3][2]까지 모두 12개 (4x3=12)의 int 값을 저장할 수 있는 공간이 마련되고, 각 배열 요소에 접근할 수 있는 방법은 아래의 그림과 같다.
2차원 배열의 초기화
2차원 배열도 괄호{}를 사용해서 생성과 초기화를 동시에 할 수 있다. 다만, 1차원 배열보다 괄호{}를 한번 더 써서 행별로 구분해준다.
int [ ][ ] arr = new int[ ][ ] { {1,2,3}, {4,5,6}};
int [] [] arr = { {1,2,3}, {4,5,6} };크기가 작은 배열은 위와 같이 간단히 한 줄로 써주는 것도 좋지만, 가능하면 다음과 같이 행별로 줄 바꿈을 해주는 것이 보기도 좋고 이해하기 쉽다.
int [ ][ ] arr = {
{1,2,3},
{4,5,6}
};※ 예제 1번 ※
package ch5; public class Ex5_8 { public static void main(String[] args) { int sum=0; int [][] score = { {100,100,100}, {20,20,20}, {30,30,30}, {40,40,40} }; for(int i=0; i<score.length;i++) { for(int j=0; j<score[i].length;j++) { System.out.printf("score[%d][%d] =%d%n",i,j,score[i][j]); sum += score[i][j]; } } System.out.println("sum = " +sum); } }
2차원 배열 score의 모든 요소의 합을 구하고, 출력하는 예제이다. 2차원 배열은 '배열의 배열'로 구성되어 있다. 즉, 여러개의 1차원 배열을 묶어서 또 하나의 배열로 만든 것이다. 그렇다면 score.length의 값은 얼마일까? 배열 참조변수 score가 참조하고 있는 배열의 길이가 얼마인가를 세어보면 될 것이다. 정답은 4이다. 그리고 score[0].length은 배열 참조변수 score[0]이 참조하고 있는 배열의 길이이므로 3이다.
※ 예제 2번 ※
package ch5; public class Ex5_9 { public static void main(String[] args) { int [] [] score = { {100, 100, 100}, {20, 20, 20}, {30, 30, 30}, {40, 40, 40}, {50, 50, 50}, }; int kor=0, eng=0, math=0; System.out.println("번호 국어 영어 수학 총점 평균" ); System.out.println("=========================="); for(int i=0; i<score.length; i++) { int sum=0; //개인별 총점 float avg = 0.0f;//개인별 평균 System.out.print(i+1); //과목별 총점 kor+=score[i][0]; eng+=score[i][1]; math+=score[i][2]; for(int j=0; j<score[i].length;j++) { sum+=score[i][j]; System.out.printf("%5d",score[i][j]); } avg= sum/(float)score[i].length; System.out.printf("%5d %6.1f%n",sum,avg); } System.out.println("=========================="); System.out.printf("총점: %5d %5d %5d", kor, eng, math); } }
5명의 학생의 세과목 점수를 더해서 각 학생의 총점과 평균을 계산하고, 과목별 총점을 계산하는 예제이다.
참고내용)
1. avg 평균을 실수로 나오게 하기 위해서 avg= sum/(float)score[i].length; (float)형으로 나눠주었다.
2. 소숫점 1자리만 나오게 하기 위해서 System.out.printf("%5d %6.1f%n",sum,avg); %6.1로 자릿수를 지정해주었다. %다음 나오는 숫자를 띄어쓰기를 의미함
※ 예제 3번 ※
package ch5; import java.util.Scanner; public class Ex5_10 { public static void main(String[] args) { String[][] words = { {"chair","의자"}, {"computer","컴퓨터"}, {"integer","정수"} }; for(int i=0; i<words.length;i++) { System.out.print(words[i][0]+"의 뜻은? "); Scanner sc = new Scanner(System.in); String answer = sc.nextLine(); if(answer.equals(words[i][1])) { System.out.println("정답입니다."); }else { System.out.println("틀렸습니다. 정답은 "+words[i][1]+"입니다."); } } } }
words[i][0]은 문제이고, words[i][1]은 답이다. words[i][0]을 화면에 보여주고 scanner를 통해 입력받은 답을 answer에 저장한다. 그 후 equlas()를 활용해 정답과 똑같은지 확인한다.
Arrays로 배열 다루기
Arrays클래스는 배열을 다루는데 유용한 메서드를 제공하는데, 그중에서도 자주 사용하는 몇가지만 정리해봤다.
1. 배열의 비교와 출력 - equals(), toString()
toString() 배열의 모든 요소를 문자열로 편하게 출력할 수 있다. toString()은 1차원 배열에서만 사용할 수 있으므로, 다차원 배열에서는 deepToString()을 사용해야 한다. deepToString()은 배열의 모든 요소를 재귀적으로 접근해서 문자열을 구성하므로 2차원뿐만 아니라 3차원 이상의 배열에도 동작한다.
int [] arr = {0,1,2,3,4,5};
int [][]arr2D = {{11,12},{21,22}};
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4, 5]
System.out.println(Arrays.deepToString(arr2D)); // [[11, 12], [21, 22]]equals()는 두 배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환한다. equlas()도 일차원 배열에서만 사용 가능하므로, 다차원 배열의 비교에서는 deepEquals()를 사용해야 한다.
2. 배열의 복사 - copyOf(), copyOfRange()
copyOf()는 배열 전체를, copyOfRange()는 배열의 일부를 복사해서 새로운 배열을 만들어 반환한다. 늘 그렇듯이 copyOfRange()에 지정된 범위의 끝은 포함되지 않는다.
package ch5; import java.util.Arrays; public class Ex5_11 { public static void main(String[] args) { int [] arr = {0,1,2,3,4,5}; int [] arr2 = Arrays.copyOf(arr, arr.length); int [] arr3 = Arrays.copyOf(arr, 3); int [] arr4 = Arrays.copyOf(arr, 7); int [] arr5 = Arrays.copyOfRange(arr, 2,4); int [] arr6 = Arrays.copyOfRange(arr, 0,7); System.out.println(Arrays.toString(arr)); System.out.println(Arrays.toString(arr2)); System.out.println(Arrays.toString(arr3)); System.out.println(Arrays.toString(arr4)); System.out.println(Arrays.toString(arr5)); System.out.println(Arrays.toString(arr6)); } }
3. 배열의 정렬 - sort()
배열을 정렬할 때는 sort()를 사용한다.
int [ ] arr = {3, 2, 0, 1, 4};
Arrays.sort(arr); //배열 arr을 정렬한다.
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]반응형'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[ch6 자바 객체] 클래스의 정의와 변수의 종류 (0) 2022.06.14 [ch6 자바 OOP] 객체지향 언어의 특징 (0) 2022.06.13 [ch5 자바 배열] String 배열의 생성과 특징 (0) 2022.06.09 [ch5 자바 배열] 선언,생성 등 배열의 기초 (0) 2022.06.09 [ch4 자바 반복문] break문 & continue문 & 이름 붙은 반복문 (0) 2022.06.08