본문 바로가기

IT&코딩/Java

Java - 6일차 (배열)

728x90
반응형

■ 배열의 개념

 

배열은 같은 자료형들끼리 모아두는 하나의 묶음이다.

자바에서 하나의 배열은 하나의 객체로 인식된다.

동일 자료형이 여러개 반복될 때 이를 하나의 변수명으로 관리하며, 각각의 구분은 순차적인 첨자자를 사용한다.

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

728x90
반응형

'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