05장- 배열 21. 02. 20.
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);
}
}
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);
}
}
- 배열 요소의 순서를 반복해서 바꾸기 (카드섞기)
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]);
}
}
}
- 배열 요소의 순서를 반복해서 바꾸기 (로또번호생성)
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]);
}
}
}
- 임의의 값으로 배열 채우기
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));
}
}
- 정렬하기(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를 빼주는 것!!!
- 빈도수 구하기
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이 됨.
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 해준거.
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);
}
}
3. 다차원 배열
3.1 2차원 배열의 선언과 인덱스