JAVA

05장- 배열 21. 02. 20.

Levinni 2021. 2. 20. 22:47

1. 배열(array)

1.1 배열이란?

- 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.

 

1.2 배열의 선언과 생성

- 선언: 원하는 타입의 변수를 선언하고 [ ] 붙이기. ex) int[] score;

- 선언은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어지는 것.

- 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것임!!

- 생성: 연산자'new'와 함께 배열의 타입과 길이 지정. ex) score = new int[5];

- 생성하면 자동적으로 각 배열요소가 타입의 기본값으로 초기화 됨.

 

1.3 배열의 길이와 인덱스

- 배열의 길이는 int범위의 양의 정수(0도 포함)이어야 함.

- 배열이름.length: 배열길이 알 수 있고, 상수기 떄문에 값을 읽을 수만 있음.

- length는 속성!! 메서드 아님!! .length()로 메서드 호출하면 안 됨.

 

1.4 배열의 초기화

int[] score = new int[] {50, 60, 70} // 배열의 생성과 초기화를 동시에.

괄호{} 안의 값 개수에 의해 배열 길이가 자동으로 결정됨.

 

배열의 선언과 생성을 같이 하면 new int[] 생략 가능.

int[] score = {50, 60, 70, 80};

 

 

 

1.5 배열의 복사

- 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야 함.

- for문보다 System.arraycopy( )를 사용하는 것이 효율적. (지정된 범위의 값들을 한 번에 통째로 복사함.)

ex) System.arraycopy(num, 0, newNum, 0 , num.length);

- num[0]에서 newNum[0]으로 num.length개의 데이터를 복사

- 복사하려는 내용보다 여유 공간이 적으면 에러(ArrayIndexOutOfboundsException) 발생.

 

package chap05;

public class ArrayEx4 {
	public static void main(String[] args) {
		char[] abc = {'A', 'B', 'C', 'D'};
		char[] num = {'0','1','2','3','4','5','6','7','8','9'};
		System.out.println(abc); // char배열이라 변수만 써도 내용 출력되는 거.
		System.out.println(num);
		
		// 배열 abc와 num을 붙여서 하나의 배열(result)로 만든다.
		char[] result = new char[abc.length + num.length];
		System.arraycopy(abc, 0, result, 0, abc.length);
		System.arraycopy(num, 0, result, abc.length, num.length);
		System.out.println(result);
		
		// 배열 abc를 배열 num의 첫 번째 위치부터 배열 abc의 길이만큼 복사
		System.arraycopy(abc, 0, num, 0, abc.length);
		System.out.println(num);
		
		// number의 인덱스 6 위치에 3개를 복사.
		System.arraycopy(abc, 0, num, 6, 3);
		System.out.println(num);
	}
}

ArrayEx4.java

 

1.6 배열의 활용

- 배열의 요소 중에서 제일 큰 값과 제일 작은 값 찾기.

package chap05;

public class ArrayEx6 {
	public static void main(String[] args) {
		int[] score = {20, 10, 40, 60, 45};
		int max = score[0]; // 배열의 첫번째 값으로 배열을 초기화 함.
		int min = score[0];
		
		for(int i = 0 ; i < score.length ; i++) {
			if(score[i] > max) {
				max = score[i];
			}
			else if(score[i] < min) {
				min = score[i];
			}
		}
		System.out.println("최대값: " + max);
		System.out.println("최소값: " + min);
	}
}

ArrayEx6.java

- 배열 요소의 순서를 반복해서 바꾸기 (카드섞기)

package chap05;

public class ArrayEx07 {
	public static void main(String[] args) {
		int[] num = new int[10];
		
		for(int i = 0 ; i < num.length ; i++) {
			num[i] = i; // 배열을 0~9의 숫자로 초기화.
			System.out.print(num[i]);
		}
		System.out.println();
		// 100번 섞기
		for(int i = 0 ; i < 100 ; i++) {
			int n = (int)(Math.random() * 10); // 0~9 랜덤으로 넣음.
			int tmp = num[0];
			num[0] = num[n];
			num[n] = tmp;
		}
		for(int i = 0 ; i < num.length ; i ++) {
			System.out.print(num[i]);
		}
	}
}

ArrayEx07.java

 

 

- 배열 요소의 순서를 반복해서 바꾸기 (로또번호생성)

package chap05;

public class ArrayEx08 {
	public static void main(String[] args) {
		int[] ball = new int[45];
		// 배열의 각 요소에 1~45값을 저장함.
		for(int i = 0 ; i < ball.length ; i++) {
			ball[i] = i + 1;
		}
		int tmp = 0; // 빈 컵
		int j = 0; // 임의값 얻어서 저장할 변수
		
		// 6번 추첨(100번해도 됨)
		for(int i = 0 ; i < 6 ; i++) {
			j = (int)(Math.random() * 45);
			tmp = ball[i]; // 0
			ball[i] = ball[j]; // 44
			ball[j] = tmp;
		}
		// 배열ball 앞에서 6개 출력
		for(int i = 0 ; i < 6 ; i++) {
			System.out.printf("ball[%d] = %d%n", i, ball[i]);
		}
	}
}

ArrayEx08.java

 

- 임의의 값으로 배열 채우기

package chap05;

import java.util.Arrays;

public class ArrayEx09 {
	public static void main(String[] args) {
		int[] code = {-4, -1, 3, 5, 11, 4}; // 불연속적인 값
		int[] arr = new int[10];
		
		for(int i = 0 ; i < arr.length ; i++) { // 담을 배열의 크기만큼 반복
			int tmp = (int)(Math.random() * code.length);
			arr[i] = code[tmp];
		}
		System.out.println(Arrays.toString(arr));
	}
}

ArrayEx09.java

 

- 정렬하기(sort)

package chap05;

public class ArrayEx10 {
	public static void main(String[] args) {
		int[] arr = new int[10];

		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] = (int) (Math.random() * 10));
		}
		System.out.println();

		for (int i = 0; i < arr.length - 1; i++) {
			boolean changed = false;  // 자리바꿈 체크

			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					int tmp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = tmp; // 왼쪽이 오른쪽보다 크면 서로 자리바꿈.
					changed = true;   // 자리바꿈 완료
				}
			}
			if (!changed) break;
			for (int k = 0; k < arr.length; k++) {
				System.out.print(arr[k]);
			}
			System.out.println();
		}
	}
}

- 비교작업(아래 for문)을 반복할수록 비교해야하는 범위는 하나씩 줄어듦.

-> 원래는 arr.length-1번을 비교해야 하는데, 매 반복마다 비교횟수가 1씩 줄어들기 때문에 바깥쪽 for문의 제어변수 i를 빼주는 것!!!

자바의정석1권 p.203
ArrayEx10.java

 

- 빈도수 구하기

package chap05;

public class ArrayEx11 {
	public static void main(String[] args) {
		int[] arr = new int[10];
		int[] counter = new int[10];
		
		for(int i = 0 ; i < arr.length ; i++) {
			arr[i] = (int)(Math.random() * 10);
			System.out.print(arr[i]);
		}
		System.out.println();
		for(int i = 0 ; i < arr.length; i++) {
			counter[arr[i]]++; //counter[i] 값을 1 증가
		}
		
		for(int i = 0 ; i < arr.length ; i++) {
			System.out.println(i + "의 개수: " + counter[i]);
		}
	}
}

- arr[0]이 6이라 하면 counter[6]의 초기값이 0이니깐 ++해서 1이 됨.

ArrayEx11.java

 

2. String배열

2.1 String배열의 선언과 생성

- String[] name = new String[3]; // 3개의 문자열을 담을 수 있는 배열을 생성.

 

2.2 String배열의 초기화

- 초기화: 기본값은 null(어떠한 객체도 가리키고 있지 않음)

- String[] name = {"Kim", "Park"}; // new String[] 생략 가능

 

예제- 16진수를 2진수로 변환하기.

package chap05;

public class ArrayEx13 {
	public static void main(String[] args) {
		char[] hex = { 'C', 'A', 'F', 'E', '2', '4' };
		String[] binary = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010",
				"1011", "1100", "1101", "1110", "1111" };
		String result = "";
		for(int i = 0 ; i < hex.length ; i++) {
			if(hex[i] >= '0' && hex[i] <= '9') {
				result += binary[hex[i]-'0'];
			}
			else { // hex[i]값이 A~F면
				result += binary[hex[i] - 'A' + 10];
			}	
		}
		System.out.println("hex: " + new String(hex));
		System.out.println("binary: " + result);
	}
}

result += binary[hex[i] - 'A' + 10]; // hex[i]가 'A'면 A-A=0이므로, A는 10을 나타내는 거니깐 +10 해준거.

ArrayEx13.java

 

2.3 char배열과  String 클래스

- String 클래스는 char배열에 기능(메서드)를 추가한 것. 문자열을 다루기 더 편리함.

메서드 설명
char charAt(int index)  
int length()  
String substring(int from, int fo) from~to범위에 있는 문자열 반환. (to는 범위에 포함되지 않음.)
boolean equals(Object obj)  
char[] toCharArray() 문자열을 문자배열(char[])로 변환해서 반환함.

char배열 -> String: String str = new String(chArr);

String -> char배열: char[] tmp = str.toCharArray();

 

package chap05;

public class ArrayEx14 {
	public static void main(String[] args) {
		String src = "ABCDE";
		
		for(int i = 0 ; i < src.length(); i++) {
			char ch = src.charAt(i);
			System.out.println("src.charat("+i+"): " + ch);
		}
		// String을 char[]로 변환
		char[] chArr = src.toCharArray();
		System.out.println(chArr);
	}
}

ArrayEx14.java

 

3. 다차원 배열

3.1 2차원 배열의 선언과 인덱스