■ 배열의 개념
배열은 같은 자료형들끼리 모아두는 하나의 묶음이다.
자바에서 하나의 배열은 하나의 객체로 인식된다.
동일 자료형이 여러개 반복될 때 이를 하나의 변수명으로 관리하며, 각각의 구분은 순차적인 첨자자를 사용한다.
reference 자료형 4byte
배열의 선언 : int[] 배열명; 또는 int 배열명[];
배열의 생성 : 배열명 = new 자료형[개수]; 배열명 = {값1, 값2, 값3};
* 배열부터는 초기화보다는 생성이라는 말을 주로 쓴다.
new에 의해서 할당되면 자동초기화 된다.
int[] x;
int x[]; // 배열의 선언
x = new int[3]; // 배열의 생성
* 2줄을 합쳐서 int[] x = new int[3];으로 쓸 수 있다.
x[0]=1;
x[1]=2;
x[2]=3; // 값의 할당
전체를 합쳐서 int[] x ={1,2,3};으로 쓸 수 있다
선언할 때는 숫자를 쓰면 안 된다.
배열의 선언을 하면 Stack에서 메모리를 예약만 한다.
배열의 생성을 하면 (new가 들어가면 무조건 Heap으로 간다) heap에 해당 칸 수만큼의 영역을 만든다.
Stack에는 그리고 번지수가 저장된다.
integer는 0으로 자동초기화
package jun.java.exam10;
public class ArrayEx1 {
public static void main(String[] ar) {
char[] ch; // 배열선언
ch = new char[4]; // 배열 초기화
// 배열 값의 할당
ch[0] = 'J';
ch[1] = 'a';
ch[2] = 'v';
ch[3] = 'a';
// 배열 내용 출력
for(int i=0; i<ch.length; i++)
System.out.println("ch[" + i + "] :" + ch[i]);
// 향상된 for문
for(char temp : ch)
System.out.println("temp : " + temp);
}
}
<결과>
ch[0] :J
ch[1] :a
ch[2] :v
ch[3] :a
temp : J
temp : a
temp : v
temp : a
[참고] main 메소드의 매개변수인 String[] ar을 사용하고 싶다면
java FileName arg1 arg2 arg3 이와 같이 실행하면 ar[0] = arg1, ar[1] = arg2, ar[2] = arg3와 같이 처리된다.
[실습] 배열을 이용하여 한명의 학생에 대해 성적처리 예제를 작성해보자. 아래 예제의 경우 실행시
java ArrayEx2 과목명1 과목명2 ... 과목명n과 같이 해야 한다.
package jun.java.exam11;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ArrayEx2 {
/**
* 성적표를 작성 - 1명에 대해서, 시험 응시 과목명에 자유도를 부여
* 실행 : java ArrayEx2 국어 영어 수학
*/
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("이름 = ");
String name = br.readLine();
String[] subject = new String[args.length]; // 과목명을 저장할 변수
// 과목수 = args.length = subject.length
for(int i=0;i<subject.length;i++)
subject[i] = args[i]; // 과목명 불러오기
int[] jumsu = new int[subject.length+1]; // +1은 총점을 저장할 공간
System.out.println();
System.out.println(name + "학생의 과목별 점수입력");
for(int i=0;i<subject.length;i++) {
System.out.print(subject[i] + "점수 = ");
jumsu[i] = Integer.parseInt(br.readLine());
jumsu[jumsu.length-1] += jumsu[i]; // 총점계산
}
float avg = jumsu[jumsu.length-1] / (float)subject.length;
avg = (int)((avg + 0.005) * 100) / 100.f;
char grade = 0;
switch((int)avg/10){
case 10:
case 9:
grade = 'A';break;
case 8:
grade = 'B';break;
case 7:
grade = 'C';break;
case 6:
grade = 'D';break;
default:
grade = 'F';break;
}
System.out.println();
System.out.print("이름\t");
for(int i=0;i<subject.length;i++)
System.out.print(subject[i] + "\t");
System.out.println("총점\t평균\t학점");
System.out.print(name + "\t");
for(int i=0;i<jumsu.length;i++)
System.out.print(jumsu[i] + "\t");
System.out.println(avg + "\t" + grade);
}
}
■ 다차원 배열
선언 : 자료형[][] 배열명; 또는 자료형 배열명[][]; 또는 자료형[] 배열명[];
초기화:
배열명 = new 자료형[row][column];
배열명 자료형[row][]; // 가변길이 배열지원
배열명 = { {1,2}, {3,4}, ...};
package jun.java.exam02;
public class ArrayEx3 {
public static void main(String[] args) {
int[][] test; // 다차원 배열 선언
test = new int[2][3];
test[0][0] = 100;
test[0][1] = 200;
test[0][2] = 300;
// ------------------------- 1행 끝
test[1][0] = 500;
test[1][1] = 600;
test[1][2] = 700;
// ------------------------- 2행 끝
for(int i=0;i<test.length;i++) {
for(int j=0;j<test[i].length;j++) {
System.out.print(
"test[" + i + "][" + j + "] = " + test[i][j] + "\t");
}
System.out.println();
}
}
}
<결과>
test[0][0] = 100 test[0][1] = 200 test[0][2] = 300
test[1][0] = 500 test[1][1] = 600 test[1][2] = 700
[실습] 다차원 배열을 이용하여 여러명에 대해서 성적 처리하는 예제를 작성하자.
아래 예제의 경우 java ArrayEx4 학생수 과목명1 과목명2 ... 과목명N과 같이 실행해야 한다.
package jun.java.exam03;
import java.io.BufferedReader;
/**
* 성적표 - 여러 사람에 대한, 과묙명에 대해서 자유도
* 실행시 - java ArrayEx4 사람수 과목1 과목2 ... 과목 N
* 예를 들면 java ArrayEx4 3 국어 영어
*/
import java.io.IOException;
import java.io.InputStreamReader;
public class ArrayEx4 {
public static void main(String[] args) throws IOException{
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
int human = Integer.parseInt(args[0]); // 사람 수
String name[] = new String[human];
String subject[] = new String[args.length-1];
// 과목수 = subject.length = args.length - 1
for(int i=0; i<subject.length; i++)
subject[i] = args[i+1]; // 과목명 옮겨오기
int[][] jumsu = new int[human][args.length]; // +1 총점의 공간
float[] avg = new float[human];
char[] grade = new char[human];
int[] rank = new int[human];
for(int i=0;i<human;i++) {
System.out.println();
System.out.print(i+1 + "번 학생 이름 = ");
name[i] = br.readLine();
System.out.println();
System.out.println(name[i] + "학생의 과목별 점수 입력");
for(int j=0; j<subject.length; j++) {
System.out.print(subject[j] + "점수 = ");
jumsu[i][j] = Integer.parseInt(br.readLine());
jumsu[i][jumsu[i].length-1] += jumsu[i][j]; // 총점
}
avg[i] = jumsu[i][jumsu[i].length-1] / (float)subject.length;
avg[i] = (int)((avg[i]+0.005)*100) / 100.f;
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;
}
} // end for human
System.out.println();
for(int i=0; i<human; i++) { // 등수계산
rank[i]++;
for(int j=0; j<human; j++) {
if(avg[i] < avg[j]) {
rank[i]++;
}
}
}
System.out.println();
System.out.print("*************");
for(int i=0; i<subject.length; i++) System.out.print("****");
System.out.print(" 성 적 표 ");
for(int i=0; i<subject.length; i++) System.out.print("****");
System.out.println("*************");
System.out.print("이름\t");
for(int i=0; i<subject.length; i++)
System.out.print(subject[i] + "\t");
System.out.println("총점\t평균\t학점\t등수");
for(int i=0; i<human; i++) {
System.out.print(name[i] + "\t");
for(int j=0; j<jumsu[i].length; j++)
System.out.print(jumsu[i][j] + "\t");
System.out.println(avg[i] + "\t" + grade[i] + "\t" + rank[i] + "\t");
}
} // end main
}
[참고] 자바의 배열은 1차원씩만 관리를 한다.
따라서 아래와 같은 형식으로 사용할 수 있다.
int[][] array =new int[3][];
array[0] = new int[2];
array[1] = new int[1];
array[2] = new int[3];
■ 가변길이 배열
이와 같은 형태의 배열을 가변길이 배열이라고 한다.
package jun.java.exam01;
public class ArrayEx5 {
public static void main(String[] args) {
int [][] test; // 다차원 배열 선언
test = new int[3][];
test[0] = new int[2]; // 1행 초기화
test[1] = new int[1]; // 2행 초기화
test[2] = new int[3]; // 3행 초기화
test[0][0] = 100;
test[0][1] = 200;
// 1행 끝
test[1][0] = 300;
// 2행 끝
test[2][0] = 400;
test[2][1] = 500;
test[2][2] = 600;
for(int i=0; i<test.length; i++) {
for(int j=0; j<test[i].length; j++) {
System.out.print(
"test["+ i + "][" + j + "] = " + test[i][j] + "\t");
}
System.out.println();
}
}
}
<결과>
test[0][0] = 100 test[0][1] = 200
test[1][0] = 300
test[2][0] = 400 test[2][1] = 500 test[2][2] = 600
[실습] 가변길이 배열을 이용하여 java.ArrayEx6 과목수 형식으로 실행을 하고 학생마다 응시과목이 다른 경우의 성적처리를 할 수 있는 프로그램을 작성해보자.
package jun.java.exam02;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 성적표 = 여러 사람에 대한, 과목수와 과목명에 대해서 자유도 (사람마다 과목의 수와 과목명이 다름)
* 실행 - java ArrayEx6 사람 수
*/
public class ArrayEx6 {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
int human = Integer.parseInt(args[0]); // 사람 수
String[] name = new String[human];
String[][] subject = new String[human][]; // 가변길이
int[][] jumsu = new int[human][]; // 가변길이
float[] avg = new float[human];
char[] grade = new char[human];
int[] rank = new int[human];
for(int i=0; i<human; i++) {
System.out.print(i+1 + "번 학생 이름 = ");
name[i] = br.readLine();
System.out.println();
System.out.print(name[i] + "학생의 응시과목 수");
int subjectNumber = Integer.parseInt(br.readLine());
subject[i] = new String[subjectNumber];
// 과목 수 = subjectNumber = subject[i].length
for(int j=0; j<subject[i].length; j++) {
System.out.print(j+1 + "번째 응시 과목명 = ");
subject[i][j] = br.readLine();
}
System.out.println();
System.out.println(name[i] + "학생의 과목별 점수 입력");
jumsu[i] = new int[subject[i].length + 1]; // +1 총점 공간
for(int j=0; j<subject[i].length; j++) {
System.out.print(subject[i][j] + "점수 = ");
jumsu[i][j] = Integer.parseInt(br.readLine());
jumsu[i][jumsu[i].length - 1] += jumsu[i][j]; // 총점계산
}
avg[i] = jumsu[i][jumsu[i].length - 1] / (float)subject[i].length;
avg[i] = (int)((avg[i] + 0.005) * 100) /100.f;
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();
} // end for human i
for(int i=0; i<human; i++) { // 등수계산
rank[i]++;
for(int j=0; j<human; j++) {
if(avg[i] < avg[j])
rank[i]++;
}
}
System.out.println();
for(int i=0; i<human; i++) {
System.out.print("*************");
for(int j=0; j<subject[i].length; j++) System.out.print("****");
System.out.print(" 성 적 표 ");
for(int j=0; j<subject[i].length; j++) System.out.print("****");
System.out.println("*************");
System.out.print("이름\t");
for(int j=0;j<subject[i].length; j++)
System.out.print(subject[i][j] + "\t");
System.out.println("총점\t평균\t학점\t등수");
System.out.print(name[i] + "\t");
for(int j=0; j<jumsu[i].length; j++)
System.out.print(jumsu[i][j] + "\t");
System.out.println(avg[i] + "\t" + grade[i] + "\t" + rank[i]);
System.out.println();
}
} // end main
}
■ 배열복사
배열은 한번 생성된 후 배열의 크기를 변경할 수 없음
크기를 더 늘리고 싶을 경우 같은 자료형의 배열을 원하는 크기로 준비하고 기존의 배열을 복사하면 작업을 완료할 수 있음
System.arraycopy() 메서드를 이용
package jun.java.exam03;
public class ArrayEx7 {
public static void main(String[] args) {
String[] src = {"Java", "Darabase", "JSP", "XML"};
String[] des = new String[6];
des[0] = "OS";
des[1] = "Network";
System.arraycopy(src, 0, des, 2, 4);
for(String temp : des)
System.out.println("des value = " + temp);
}
}
<결과>
des value = OS
des value = Network
des value = Java
des value = Darabase
des value = JSP
des value = XML
'IT&코딩 > Java' 카테고리의 다른 글
Java - 8일차 (객체지향 프로그래밍(클래스)) (0) | 2022.10.23 |
---|---|
Java - 7일차 (Game 설계) (0) | 2022.10.23 |
Java - 5일차 (제어문) (0) | 2022.10.20 |
Java - 4일차 (표준입출력) (0) | 2022.10.20 |
Java - 3일차 (연산자) (2) | 2022.10.20 |