본문 바로가기
BackEnd/Java

[Java] 다차원 배열 Multi Array

by summer_light 2021. 7. 1.

다차원 배열 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

댓글