2차원 배열 - 2 Dimensional Array
2차원 배열 - 2 Dimensional Array
1. 2차원 배열
타입[][] 변수 = new 타입[크기][크기]로 선언한다.
ex)int[][] a = new int[5][5]앞은 행의 크기 뒤는 열의 크기를 뜻함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public static void main(String[] args) {
//1차원 배열
int[] subjectArr = new int[5];
//2차원 배열
int[][] pointArr = new int[4][3]; // 행 = 4 , 열 = 3
pointArr[0][0] = 1;
/*
* index =>
* ---------------------------
* | [0][0] | [0][1] | [0][2]|
* ---------------------------
* | [1][0] | [1][1] | [1][2]|
* ---------------------------
* | [2][0] | [2][1] | [2][2]|
* ---------------------------
* | [3][0] | [3][1] | [3][2]|
* ---------------------------
*
* */
pointArr[0][0] = 10;
pointArr[0][1] = 20;
pointArr[0][2] = 30;
pointArr[1][0] = 40;
pointArr[1][1] = 50;
pointArr[1][2] = 60;
pointArr[2][0] = 70;
pointArr[2][1] = 80;
pointArr[2][2] = 90;
pointArr[3][0] = 100;
pointArr[3][1] = 100;
pointArr[3][2] = 100;
System.out.println("2차원 배열의 길이 => "+pointArr.length);// 4라고 나옴
// .length 메서드는 행의 길이가 나온다.
System.out.println("pointArr[0].length => "+ pointArr[0].length); // 3 이라고 나옴
// .2차원배열명[행의인덱스].length 는 그 행에 존재하는 열의 길이(크기)가 나온다.
}
1
2
3
4
5
6
7
8
for(int i = 0; i < pointArr.length; i++) {
//바깥 for문에는 행이 돈다.
for(int j = 0; j < pointArr[j].length; j++) {
//안쪽 for문에는 열이 돈다.
String add = j < pointArr[j].length-1 ? ",": "\n";
System.out.printf("%d%s", pointArr[i][j], add);
}
}
- 응용 2차원 배열을 사용하여 총점과 평균 값 구하기
for(변수선언 : 배열){ ... }을 사용하여 배열에 효율적으로 반복문을 사용할 수 있다.
new int[]은 생략 가능하다.- 대입되는 배열의 값을 기준으로 배열의 크기가 자동 지정된다.
- 아래 코드는
int[7]이다.- 즉 사용가능한 index 값은
0 ~ 6까지 이고scores[7] = 100
이런식으로 사용할시 예외ArrayIndexOutOfBoundsException발생한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
----------------------------------------------------
국어 영어 수학 총점 평균 학점 등수
----------------------------------------------------
90 80 70 240 80.0 B 4
80 85 76 241 80.3 B 2
80 85 76 241 80.3 B 2
85 70 90 245 81.7 B 1
60 80 50 190 63.3 D 5
====================================================
395 400 362
79.0 80.0 72.4
*/
System.out.println("\n=================== 성적결과 ===================\n");
// 이순신, 엄정화, 홍길동, 공유, 아이유 점수 구하기 과목은 국어 영어 수학 순
int[][] scoreArr = { {90,80,70}, //이순신
{80,85,76}, //엄정화
{80,85,76}, //홍길동
{85,70,90}, //공유
{60,80,50} //아이유
};
System.out.println("--------------------------------------------------");
System.out.println("국어\t영어\t수학\t총점\t평균\t학점\t등수");
System.out.println("--------------------------------------------------");
//학생별 총점 저장 변수
int[] scoreSum = new int[scoreArr.length];
//출력 결과 저장 변수
String[] result = new String[scoreArr.length];
for(int i = 0; i<scoreArr.length; i++) {
int sum = 0;
for(int j : scoreArr[i]) {
sum += j;//국영수 합산
if (result[i]==null) result[i]="";
result[i] += j+"\t";//국영수 점수를 담는다
}
scoreSum[i] = sum;
}
//등수 저장 변수
int[] rankArr = new int[scoreArr.length];//등수 배열 인덱스는 각 학생과 동일
for(int i = 0; i<scoreArr.length; i++) {
int rank = 1;
for(int j : scoreSum) {
if(scoreSum[i] < j) rank += 1;
}
rankArr[i] = rank;
}
for(int i = 0 ; i< scoreArr.length ; i++) {
double avg = Math.round(scoreSum[i]/3d*10)/10d;//평균
char rating = switch((int) avg/10) {//학점
case 9 -> 'A';
case 8 -> 'B';
case 7 -> 'C';
case 6 -> 'D';
default -> 'F';
};
System.out.println(result[i]+scoreSum[i]+"\t"+avg+"\t"+rating+"\t"+rankArr[i]);
}
2. 객체 배열과 for문 활용
for문을 활용하여 객체 배열 돌리기
- 스캐너에 입력된 값을 토대로 회원 인스턴스를 생성한다.
- 회원 인스턴스를 배열에 넣는다.
- 회원배열은 최대 3개까지 생성 할수 있다.
- 아이디는 중복 될 수 없다.
- 비밀번호는 영문자(대문자 or 소문자)와 숫자, 특수문자의 조합
8 ~ 15 글자- 이름은 2 ~ 6 글자 한글로만 작성 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public class MemberMain {
private static MyMember[] memberArr = new MyMember[3];
private static void addMember(MyMember[] memberArr, MyMember newMember) {
for (int i = 0; i < memberArr.length; i++) {
if (memberArr[i] == null) {
memberArr[i] = newMember;
System.out.println(newMember.getName() + "를 " + i+"번째 인덱스에 가입 시킴");
return;
}
}
System.out.println(newMember.getName()+"를 추가하지 못했어 회원 꽉참");
}
//중복확인
private static boolean duplicationId(String id) {
for(MyMember m : memberArr)
if(m!=null)
if(m.getNo().equals(id))
return true;
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String userSelect = "";
while( !(userSelect.equals("3")) ) {
System.out.println("\n============ >> 메뉴 << ============\n"
+ "1.회원가입 2.모든회원조회 3.프로그램종료\n"
+ "=====================================");
System.out.print("▷ 선택하세요 => ");
userSelect = sc.nextLine().trim();
// trim 으로 앞 뒤 모든 공백제거 ⬆️ (중앙에 낀 공백은 제거 되지 않는다.)
switch(userSelect) {
case "1" :
String id = null;
String pw = null;
String name = null;
while(true) {
System.out.print("\n✔️아이디 => ");
id = sc.nextLine();
if(id.isBlank()) {
System.out.println(">>[경고] 아이디값을 공백이 아닌 다른 값으로 입력하세요\n");
continue;
}else if(duplicationId(id)) {
System.out.println(">>[경고] 아이디값 중복 다른 아이디로 설정하세요\n");
continue;
}
break;
}
while(true) {
System.out.print("\n✔️비밀번호 => ");
pw = sc.nextLine();
if(!MyUtil.passwordVerify(pw)) {
System.out.println(">>[경고] 비밀번호는 8글자 이상 15글자 이하의 영문 대,소문자 및 숫자와 특수문자가 혼합되어야만 합니다.\n");
continue;
}
break;
}
while(true) {
System.out.print("\n✔️이름 => ");
name = sc.nextLine();
if(!MyUtil.nameVerify(name)) {
System.out.println(">>[경고]성명은 공백이 없는 한글로만 2글자 이상 6글자 이하로 입력하세요!! \n");
continue;
}
break;
}
MyMember newMember = MyMember.of(name,id, pw);
addMember(memberArr, newMember);
break;
case "2" :
for(int i=0;i< memberArr.length;i++) {
if(memberArr[i] != null)
System.out.println(i+1+"번째 유저 => "+memberArr[i].getInfo());
}
break;
case "3" : break;
default :
System.out.println("\n\t다시 입력 하세요.");
break;
}
}
sc.close();
System.out.println("\n=================종료=================");
}
}
1
2
3
4
5
6
7
8
9
10
//MyUtil.class
public static boolean passwordVerify(String pw) {
return pw.matches("^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[!@#$%^&*])[a-zA-Z\\d!@#$%^&*]{8,15}$");
}
public static boolean nameVerify(String name) {
if(name.length()<2||name.length()>6) return false;
for(char i : name.toCharArray())
if(!(i>='가'&& i<='힣')) return false;
return true;
}
🔄 while문 활용 팁 🔄
isEmpty와 isBlank
메서드 설명 isEmpty()문자열의 길이가 0인지 확인 ( ""이면true)isBlank()공백 문자(공백, 탭, 개행)만 포함되었는지 확인 아래 코드 참고
1 2 3 4 5 6 7 8 String emptyStr = ""; String blankStr = " "; System.out.println(emptyStr.isEmpty()); // true System.out.println(emptyStr.isBlank()); // true System.out.println(blankStr.isEmpty()); // false System.out.println(blankStr.isBlank()); // true
null인 경우엔 두 메서드 다NullPointerException이 발생한다.
✨💡 팁 💡✨
2차원 배열을 생성할때 각 행의 열의 개수가 같을 필요는 없다.
- 배열안의 배열이라고 생각 하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class TwoDemensionArrayMain3 {
public static void main(String[] args) {
int[][] num_arr = new int[4][]; // 4행 null열
// 초기화가 안되어 있어서 NullPointerException 발생
// num_arr[0][0] = 10;
// num_arr[0][1] = 20;
// num_arr[0][2] = 30;
// num_arr[1][0] = 40;
// num_arr[1][1] = 50;
// num_arr[1][2] = 60;
// 각 행을 초기화
num_arr[0] = new int[3]; // 0행은 3열로 설정함.
num_arr[1] = new int[2]; // 1행은 2열로 설정함.
num_arr[2] = new int[4]; // 2행은 4열로 설정함.
num_arr[3] = new int[3]; // 3행은 3열로 설정함.
// 빈공간들은 기본값으로 초기화된다. ex) int = 0
num_arr[0][0] = 10;
num_arr[0][1] = 20;
num_arr[0][2] = 30;
// ArrayIndexOutOfBoundsException 발생
// num_arr[1][2] = 30;
for (int i = 0; i < num_arr.length; i++) {
for (int j = 0; j < num_arr[i].length; j++) {
String add = j < num_arr[i].length - 1 ? "," : "\n";
System.out.printf("%2d%s", num_arr[i][j], add);
}
}
System.out.println("\n------------------------------------------------------------------------------------------------------------------\n");
int[][] numArr = {
{10, 20, 30},
{40, 50},
{60, 70, 80, 90},
{0}
}; // 열 개수가 똑같을 필요는 없다.
for (int i = 0; i < numArr.length; i++) {
for (int j = 0; j < numArr[i].length; j++) {
String add = j < numArr[i].length - 1 ? "," : "\n";
System.out.printf("%2d%s", numArr[i][j], add);
}
}
}
}
이 작성글은 저작권자의 CC BY 4.0 라이센스를 따릅니다.





