Java Array

Java Array

java

참고서적 : Java의정석 3rd Edition
선언 및 초기화 부분을 제외하고 헷갈리거나 다시한번 알아 둘 만한 내용을 적었습니다.

배열의 출력

1
2
3
4
5
6
7
8
int[] Arr = {100, 50, 20, 30, 10};

System.out.println(Arrays.toString(Arr));
//[100, 50, 20 ,30, 10]이 출력된다.

System.out.println(Arr);
//I@14318bb <- 실행할때마다 달라질 수 있다.

I@14318bb I는 1차원 int 배열이라는 의미이고 @ 뒤에나오는 16진수는 실제 주소가 아닌 내부 주소이다.

단 예외적으로 char배열일 경우 그냥 출력을 해도 값이 나온다.

1
2
3
char[] carr = {'a','b','c','d'};
System.out.println(carr);
// abcd

char Arrays경우 println메서드로 출력하면 각 요소가 구분자 없이 그대로 출력된다.

배열의 복사

일반 적인 배열의 복사에는 for문을 이용한 복사와
System.arraycopy()를 이용한 복사가 있다.

차이점 : for문은 배열의 요소 하나하나의 접근, arraycopy()는 지정된 범위의 값들을 한 번에 복사한다.

1
2
3
4
5
// for문을 이용한 복사
for(int i = 0; i < num.length; i++) { newNum[i] = num[i]; }

// arraycopy()를 이용한 복사
System.arraycopy(num, 0, newNum, 0, num.length);

num의 0 번째 요소부터 시작해서 num.length개의 데이터를 newNum[0]에 복사한다.

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
package chapter05;

public class ArrayEx4 {

public static void main(String[] args) {
char[] abc = {'A', 'B', 'C', 'D'};
char[] num = {'0', '1', '2','3','4','5','6'};
char[] han = {'ㄱ', 'ㄴ'};

System.out.println(abc);
System.out.println(num);
System.out.println(han);


char[] newArr = new char[abc.length+num.length+han.length];

System.arraycopy(abc, 0, newArr, 0, abc.length);
System.arraycopy(num, 0, newArr, abc.length, num.length);
System.arraycopy(han, 0, newArr, abc.length+num.length, han.length);

System.out.println(newArr);
}
}

배열의 활용

카드섞기, 로또번호생성, 임의의 값으로 배열 채우기, 정렬하기, 빈도수 구하기 문제를 풀어본다.

카드섞기 문제

길이가 10인 배열 numArr를 생성하고 0~9의 숫자로 차례대로 초기화하여 출력한다.
ramdom()을 이용해서 배열의 임의의 위치에 있는 값과 배열의 numArr[0]의 값을 교환하는 일을 100번 반복한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package chapter05;

import java.util.Arrays;

public class ArrayEx7 {

public static void main(String[] args) {
int[] numArr = {0,1,2,3,4,5,6,7,8,9};

System.out.println(Arrays.toString(numArr));
for(int i = 0 ; i < 100; i++) {
int n = (int) (Math.random()*10);
int temp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = temp;
}
System.out.println(Arrays.toString(numArr));

}
}

로또번호 생성

ball 배열에 1~45까지 값을 담은 다음 배열의 첫 번째 값과 random()에 의해서 결정된 임의의 위치가 있는 값과 자리를 바꾸는 것을 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
package chapter05;

public class ArrayEx8 {
public static void main(String[] args) {
int[] ball = new int[45];

for (int i = 0; i < ball.length; i++) {
ball[i] = i + 1;
}

int temp = 0;
int j = 0;

for (int i = 0; i < 6; i++) {
j = (int) (Math.random() * 45); // 0~44범위의 임의의 값을 얻는다.
// temp 변수를 사용하여 ball[i], ball[j]를 변경
temp = ball[i];
ball[i] = ball[j];
ball[j] = temp;
}
for (int i = 0; i < 6; i++) {
System.out.print(ball[i]+" ");
}
}
}

임의 값으로 배열을 채우기 위해서는 Math.random()*n을 사용하면 된다.
n은 0~n-1의 범위를 나타낸다.

버블정렬

길이가 10인 배열에 0과 9사이의 임의의 값으로 채운 다음, 버블 정렬 알고리즘을 통해서 크기순으로 정렬하라.

버블정렬 배열의 1번째 부터 n-1까지의 요소에 대해, 근접한 값과 크기를 비교하여 자리 바꿈을 반복한다.

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
package chapter05;

public class ArrayEx10 {

public static void main(String[] args) {
int[] arr = 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 - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}

for(int k = 0; k < arr.length ; k++) {
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
}

버블정렬은 length가 10이라고 가정할경우 총 9번의 반복을 통해 최종 결과를 도출하며 각각의 반복안에서도 옆의 값과 비교를 해야한다.
이때 반복이 지속될수록 큰 순서대로 정렬이 이루어지기 때문에 정렬이 된부분은 반복할 필요가 없어진다는 점을 유의해야한다.

추가사항 자리바꿈이 발생하지 않는다면 반복문을 벗어나라.
위의 값은 정렬이 완료가 되어도 반복문의 횟수를 채우지만 아래의 코드는 정렬이 완료되는 순간 반복을 종료하고 값을 출력한다.

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
package chapter05;

public class ArrayEx10_1 {
//자리바꿈 없을시 종료.
public static void main(String[] args) {
int[] arr = 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 - 1; i++) {

boolean change = false;

for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
change = true;
}
}
if(!change) break; // 자리바꿈이 없을시 종료

for(int k = 0; k < arr.length ; k++) {
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
}

boolean 변수를 사용하여 자리바꿈이 없을시 종료하여 자원소모를 방지.

Share