다차원 배열 Multi Array
다차원 배열 선언
자료형[][] 배열이름 = new 자료형[행][열];
int[][] multiArr01 = new int[2][4];
위와 같이 선언한다면, multiArr01 이라는 배열은 2행 4열의 배열이 될 것이고, 자료형은 int(정수형)가 된다.
다차원 배열의 원소 불러오기
multiArray[2][3] 은 multiArray의 2행 3열의 원소를 불러온다.
배열이름.length 와 배열이름[행].length
multiArray.length = 2 → 행 길이
multiArray[1].length = 3 → 열 길이
이 부분이 헷갈릴 수 있는데, multiArray[1]은 1행을 의미하는 것 같기 때문에 행 길이가 출력되어야 할 것 같은 느낌이 들기 때문이다. 실제로 다차원 배열은 아래 그림처럼 저장되기 때문에, multiArray[1]은 그 자체로 [4, 5, 6]이 된다.
즉 위와 같이 multiArray[1] == [4, 5, 6] 이기 때문에,multiArray[1].length 를 하면 [4, 5, 6]의 길이인 열 길이가 출력이 되는 것이다.
Arrays.toString의 결과
- Arrays.toString(multiArr01) → [[I@7637f22, [I@4926097b] 주소값
2차원 배열을 넣으면, 배열안에 주소값을 넣어 반환한다. - Arrays.toString(multiArr01[0]) → [0, 0, 0, 0] 배열 출력
1차원 배열을 넣으면, 그 배열을 그대로 반환한다.
String.ValueOf의 결과
배열을 표현할 때 Arrays.toString과 헷갈리는 경우가 있어 유의해야 한다.
String.ValueOf(배열)은 주소값을 반환한다.
String.valueOf(숫자)
int num = 8888;
String str = String.valueOf(num);
System.out.println(str);
위와 같은 코드를 실행하면, str에 8888을 저장하게 되고, 즉 str=="8888" 이 된다.
이처럼 String.ValueOf(배열)을 실행하면
System.out.println(String.valueOf(multiArr01));
System.out.println(String.valueOf(multiArr01[0]));
[[I@762efe5d → multiArr01의 주소
[I@7637f22 → multiArr01[0]의 주소
이 출력된다.
앞서 언급했던 Arrays.toString과 비교해보면
System.out.println(Arrays.toString(multiArr01));
System.out.println(Arrays.toString(multiArr01[0]));
[[I@7637f22, [I@4926097b] → [ multiArr01[0]의 주소, multiArr01[1]의 주소 ]
[1, 2, 3, 4] → multiArr01[0] 을 그대로 반환
와 같이 String.ValueOf를 이용했을 때와 다른 결과가 나온다는 것을 알 수 있다.
2차원 배열 사용해보기
package may27;
import java.util.Arrays;
// 2차원 배열
public class MultiArray02 {
public static void main(String[] args) {
int[][] multiArr01 = new int[2][4];
/*
* [1, 2, 3, 4]
* [5, 6, 7, 8]
*/
for (int i = 0; i < multiArr01.length; i++) {
for (int j = 0; j < multiArr01[i].length; j++) {
System.out.print(multiArr01[i][j] + ", ");
}
System.out.println("");
}
System.out.println("==========================================");
//출력문
System.out.println(Arrays.toString(multiArr01)); // [[I@7637f22, [I@4926097b] 주소값
for (int i = 0; i < multiArr01.length; i++) {
System.out.println(Arrays.toString(multiArr01[i])); //
}
System.out.println("============================================");
//출력문
for (int[] is : multiArr01) { //multiArr01속의 int[]배열의 이름을 is라고 한다
System.out.println(Arrays.toString(is));
}
System.out.println("============================================");
//값 대입
for (int i = 0; i < multiArr01.length; i++) {
for (int j = 0; j < multiArr01[i].length; j++) {
multiArr01[i][j] = (i * 4) + j + 1;
}
System.out.println(Arrays.toString(multiArr01[i]));
}
System.out.println("============================================");
System.out.println(Arrays.toString(multiArr01));
System.out.println(Arrays.toString(multiArr01[0]));
System.out.println(String.valueOf(multiArr01));
System.out.println(String.valueOf(multiArr01[0]));
}
}
출력결과
0, 0, 0, 0,
0, 0, 0, 0,
==========================================
[[I@7637f22, [I@4926097b]
[0, 0, 0, 0]
[0, 0, 0, 0]
============================================
[0, 0, 0, 0]
[0, 0, 0, 0]
============================================
[1, 2, 3, 4]
[5, 6, 7, 8]
============================================
[[I@7637f22, [I@4926097b]
[1, 2, 3, 4]
[[I@762efe5d
[I@7637f22
예제01. 성적 입출력 프로그램
학생 이름도 입력받아서 같이 출력
학생이름, java, jsp, spring
학생이름, java점수, jsp점수, spring점수, 총점, 평균, 등급
2차원 배열, 스위치, for, if
package may27;
import java.util.Scanner;
// 성적 입력 및 출력하는 프로그램
// 학생이름, java, jsp, spring 입력받아
// 학생이름, java점수, jsp점수, spring점수, 총점, 평균, 등급 출력
// 2차원배열, 스위치, for, if 사용
public class MultiArray03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("학생 수를 입력하세요. : ");
int input = sc.nextInt();
int[][] student = new int[input][4];
String[] name = new String[input];
String[] subject = {"java", "jsp", "spring"};
char[] grade = new char[input];
double[] avg = new double[input];
for (int i = 0; i < name.length; i++) {
System.out.print("이름을 입력하세요. : ");
name[i] = sc.next();
for (int j = 0; j < subject.length; j++) {
do {
System.out.println(subject[j] + "점수를 입력하세요. : ");
student[i][j] = sc.nextInt();
} while (student[i][j] < 0 || student[i][j] > 100);
}
//총점
student[i][3] = student[i][0] + student[i][1] + student[i][2];
//평균
avg[i] = student[i][3] / 3.0;
//등급
switch ((int) (avg[i] / 10)) {
case 10:
case 9:
grade[i] = 'A';
break;
case 8:
grade[i] = 'B';
break;
case 7:
grade[i] = 'C';
break;
case 6:
grade[i] = 'D';
break;
default:
grade[i] = 'F';
break;
}
}
//전체 출력
System.out.println("┏━━━━━━┳━━━━━━┳━━━━━┳━━━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━┓");
System.out.println("┃ 이름 ┃ 자바 ┃ jsp ┃ spring ┃ 총점 ┃ 평 균 ┃ 등급 ┃");
System.out.println("┣━━━━━━╋━━━━━━╋━━━━━╋━━━━━━━━╋━━━━━━╋━━━━━━━╋━━━━━━┫");
for (int i = 0; i < name.length; i++) {
System.out.printf ("┃%3.2s ┃ %2d ┃ %2d ┃ %2d ┃ %3d ┃ %.2f ┃ %c ┃\n",
name[i], student[i][0], student[i][1], student[i][2], student[i][3],avg[i], grade[i]);
}
System.out.println("┗━━━━━━┻━━━━━━┻━━━━━┻━━━━━━━━┻━━━━━━┻━━━━━━━┻━━━━━━┛");
//%S = 모두 대문자처리
//%3.2s = 3.2 = 3칸 할당 2개만 표시하고 나머지는 삭제 ex) 홍길동 이면 홍길
//%4d = 4칸 할당해서 찍음 ex) 60이면 __60
//%.2f = 소수점 아래 2자리 ex) 60.123이면 60.12
}
}
- %S
모두 대문자처리 - %3.2s
3칸 할당 2개만 표시하고 나머지는 삭제 ex) 홍길동 이면 홍길 - %4d
4칸 할당해서 찍음 ex) 60이면 __60 - %.2f
소수점 아래 2자리 ex) 60.123이면 60.12
실행결과
학생 수를 입력하세요. : 1
이름을 입력하세요. : 김태하
java점수를 입력하세요. :
9
jsp점수를 입력하세요. :
99
spring점수를 입력하세요. :
99
┏━━━━━━┳━━━━━━┳━━━━━┳━━━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━┓
┃ 이름 ┃ 자바 ┃ jsp ┃ spring ┃ 총점 ┃ 평 균 ┃ 등급 ┃
┣━━━━━━╋━━━━━━╋━━━━━╋━━━━━━━━╋━━━━━━╋━━━━━━━╋━━━━━━┫
┃ 김태 ┃ 9 ┃ 99 ┃ 99 ┃ 207 ┃ 69.00 ┃ D ┃
┗━━━━━━┻━━━━━━┻━━━━━┻━━━━━━━━┻━━━━━━┻━━━━━━━┻━━━━━━┛
폰트가 다르니 깨져버린다. 😥
예제02. 임의의 배열 만들기
다음과 같은 3x3 배열을 만들기
[1,2,3]
[4,5,6]
[7,8,9]
package may27;
import java.util.Arrays;
public class MultiArray04 {
public static void main(String[] args) {
int[][] Array = new int[3][3];
int number = 1;
for (int i = 0; i < Array.length; i++) {
for (int j = 0; j < Array.length; j++) {
Array[i][j] = number;
number++;
}
System.out.println(Arrays.toString(Array[i]));
}
}
}
예제03. 중복없는 배열 만들기 - 1
1행 1열부터 순서대로 3행 3열까지 채워 나가는 방식이며,
현재 위치에 '랜덤하게 뽑은' '중복이 아닌' 숫자를 저장한다.
예를 들어 만약 현재 위치가 2행 2열이라면,
랜덤하게 숫자를 뽑은 후 행 1열부터 2행 1열까지의 숫자와 겹치는 숫자가 있는지 확인하고
중복이라면 2행 2열의 숫자를 다시 뽑는 방식이다.
주요한 구조는 다음과 같다.
- break F:를 이용하여 중복을 발견하는 순간, 새로운 랜덤 숫자를 뽑도록 반복문을 바로 탈출한다.
- 중복이 발생한 경우 ch = false; 를 이용하여 중복이 발생한 경우 현재 뽑은 랜덤 숫자가 대입되지 않도록 한다.
package may27;
import java.util.Arrays;
public class MultiArray05 {
public static void main(String[] args) {
int[][] Array = new int[3][3];
for (int i = 0; i < Array.length; i++) {
for (int j = 0; j < Array[i].length; j++) {
int random = (int)(Math.random()*9+1);
System.out.println(i + ":" + j + ":" + random);
boolean ch = true;
F: for (int k = 0; k < Array.length; k++) {
for (int k2 = 0; k2 < Array.length; k2++) {
if(Array[k][k2] != 0 && random == Array[k][k2]) {
System.out.println("중복");
j--;
ch = false;
break F;
}
}
}
if(ch) Array[i][j] = random;
}
}
for (int[] is : Array) {
System.out.println(Arrays.toString(is));
}
}
}
[참고] Math.random()
Math.random()*n
0부터 n-1까지의 수를 무작위로 반환할 때 쓴다.
따라서 이를 응용하여 1부터 n까지의 수를 무작위로 반환하고 싶은 경우
Math.random()*n + 1
를 사용하면 된다.
[참고] F:
for 문 앞에 F: 라는 라벨을 붙여두면,
break F; 를 이용하여 F: 라벨이 붙은 for문을 탈출할 수 있다.
원하는 곳으로 break하고 싶을 때 사용한다.
실행결과:
0:0:7
0:1:4
0:2:4
중복
0:2:7
중복
0:2:2
1:0:8
1:1:1
1:2:4
중복
1:2:2
중복
1:2:7
중복
1:2:9
2:0:9
중복
2:0:8
중복
2:0:2
중복
2:0:9
중복
2:0:5
2:1:8
중복
2:1:4
중복
2:1:7
중복
2:1:5
중복
2:1:2
중복
2:1:6
2:2:5
중복
2:2:2
중복
2:2:9
중복
2:2:4
중복
2:2:7
중복
2:2:6
중복
2:2:2
중복
2:2:3
[7, 4, 2]
[8, 1, 9]
[5, 6, 3]
예제 04. 중복없는 배열 만들기 - 2
1부터 9까지 연속된 숫자로 구성되어야 하기 때문에 아래와 같은 방법으로도 만들 수 있다. 위와는 다르게 1부터 9까지 순서대로 값을 넣을 것이며, '랜덤하게 찾은' '빈 자리에' 현재 순서의 숫자를 저장하는 방법이다.
주요한 구조는
package may27;
import java.util.Arrays;
public class MultiArray05 {
public static void main(String[] args) {
int[][] three = new int [3][3]; //초기값 = 0
for (int i = 1; i < 10; i++) { // 숫자 1 ~ 9
int r1 = (int) (Math.random() * 3); //index 0, 1, 2
int r2 = (int) (Math.random() * 3); //index 0, 1, 2
if (three[r1][r2] == 0) {
three[r1][r2] = i;
} else {
i--;
System.out.println(r1 + ":" + r2 + " 중복");
}
}
for (int[] is : three) {
System.out.println(Arrays.toString(is));
}
}
}
실행결과:
0:0:5
0:1:9
0:2:8
1:0:9
중복
1:0:7
1:1:5
중복
1:1:6
1:2:8
중복
1:2:3
2:0:1
2:1:2
2:2:6
중복
2:2:5
중복
2:2:6
중복
2:2:7
중복
2:2:5
중복
2:2:1
중복
2:2:8
중복
2:2:7
중복
2:2:3
중복
2:2:5
중복
2:2:6
중복
2:2:5
중복
2:2:5
중복
2:2:2
중복
2:2:2
중복
2:2:9
중복
2:2:1
중복
2:2:3
중복
2:2:9
중복
2:2:7
중복
2:2:1
중복
2:2:8
중복
2:2:2
중복
2:2:6
중복
2:2:7
중복
2:2:4
[5, 9, 8]
[7, 6, 3]
[1, 2, 4]
'BackEnd > Java' 카테고리의 다른 글
[Java] 날짜 형식 Date Format (0) | 2021.07.01 |
---|---|
[Java] 문자(Character), 문자열(String) (0) | 2021.07.01 |
[Java] 배열 Array (0) | 2021.07.01 |
[Java] 무한 반복문 While, Do While (0) | 2021.07.01 |
[Java] 스위치 Switch (0) | 2021.07.01 |
댓글