배열(Array)
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.
배열의 생성과 선언
배열선언
선언방법 | 선언 예 |
---|---|
타입[] 변수이름; | int[] score; String[] name; |
타입 변수이름[]; | int score[]; String scroe[]; |
배열생성
변수이름 = new 타입 [길이];
ex) scroe = new int [5]; - int타입의 값 5개를 지정할 수 있는 배열을 생성
int [] scroe = new int [5]; - 선언과 생성을 동시에도 가능
(대부분 이렇게 사용)배열의 길이와 인덱스
생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.
인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. - 인덱스(index)의 범위는 0부터 '배열길이 '-1'까지
package Array;
public class ArrayEx1 {
public static void main(String[] args) {
int[] score = new int[5];
int k = 1;
score[0] = 50;
score[1] = 60;
score[k+1] = 70;
score[3] = 80;
score[4] = 90;
int tmp = score[k+2] + score[4];
for(int i=0; i < 5; i++) {
System.out.printf("score[%d] : %d%n",i, score[i]);
}
System.out.printf("tmp : %d%n", tmp);
System.out.printf("score[%d]: %d%n", 7, score[7]);
}
}
//결과
score[0] : 50
score[1] : 60
score[2] : 70
score[3] : 80
score[4] : 90
tmp : 170
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 7 out of bounds for length 5
at Array.ArrayEx1.main(ArrayEx1.java:21)
아래의 오류는 index의 범위는 0~4이지만, 호출하려는 인덱스가 7이기에 인덱스 값을 벗어났다는 오류이다.
배열의 길이
int[] arr = new int[5]; → 길이가 5인 int 배열
배열이름.length
배열의 길이를 구해야하는 경우가 종종 있다. 자바에서는 JVM이 모든 배열의 길이를 별도로 관리하기에 추출이 가능하다.
int[] arr = new int[5];
int tmp = arr.length //tmp = 5
배열의 길이 변경하기
- 더 큰 배열을 새로 생성한다.
- 기존 배열의 내용을 새로운 배열에 복사한다.
배열의 초기화
int[] score = new int[] {50, 60, 70, 80, 90};
int[] score = {50, 60, 70, 80, 90};
⇒ 배열의 선언과 생성을 따로 하는 경우 new 타입[]은 생략이 불가하다.
배열의 출력
배열을 초기화할 때 for문을 사용하듯이, 배열에 저장된 값을 for문으로 하면된다.
int[] iArr = {100, 90, 80, 70 60};
for(int i=0; i<iArr.length; i++){
System.out.println(iArr[i]);
}
package Array;
import java.util.Arrays;
public class ArrayEx2 {
public static void main(String[] args) {
int[] iArr1 = new int[10];
int[] iArr2 = new int[10];
// int[] iArr3 = new int[] {100, 95, 80, 70, 60};
int[] iArr3 = {100, 95, 80, 70, 60};
char[] chArr = {'a', 'b', 'c', 'd'};
for(int i =0; i<iArr1.length; i++) {
iArr1[i] = i+1;
}
for(int i=0; i<iArr2.length; i++) {
iArr2[i] = (int)(Math.random()*10) + 1;
}
for(int i=0; i < iArr1.length; i++) {
System.out.print(iArr1[i]+", ");
}
System.out.println();
System.out.println(Arrays.toString(iArr2));
System.out.println(Arrays.toString(iArr3));
System.out.println(Arrays.toString(chArr));
System.out.println(iArr3);
System.out.println(chArr);
}
}
//결과
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
[8, 10, 8, 7, 7, 8, 6, 3, 5, 9]
[100, 95, 80, 70, 60]
[a, b, c, d]
[I@2d363fb3
abcd
배열의 복사
배열은 한번 생성하면 그 길이를 변경할 수 없기 때문에 더 많은 저장공간이 피룡하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야한다고 했다.
for문을 이용해서 배열을 복사하는 방법은 다음과 같다.
package Array;
public class ArrayEx3 {
public static void main(String[] args) {
int[] arr = new int[5];
for(int i=0; i< arr.length; i++) {
arr[i] = i+1;
}
System.out.println("[변경전]");
System.out.println("arr.length : "+ arr.length);
for(int i=0; i<arr.length; i++)
System.out.println("arr["+i+"] : "+arr[i]);
int[] tmp = new int[arr.length*2];
for(int i=0; i < arr.length; i++)
tmp[i] = arr[i];
arr =tmp;
System.out.println("변경후");
System.out.println(arr.length);
for(int i=0; i<arr.length; i++)
System.out.println("arr["+i+"] : "+arr[i]);
}
}
//결과
[변경전]
arr.length : 5
arr[0] : 1
arr[1] : 2
arr[2] : 3
arr[3] : 4
arr[4] : 5
변경후
10
arr[0] : 1
arr[1] : 2
arr[2] : 3
arr[3] : 4
arr[4] : 5
arr[5] : 0
arr[6] : 0
arr[7] : 0
arr[8] : 0
arr[9] : 0
System.arraycopy()를 이용한 배열의 복사
배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.
package Array;
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);
System.out.println(num);
//배열 abc와 num을 붙여서 하나의 배열(result)로 만든다.
char[] result = new char[abc.length+num.length];
System.arraycopy(num, 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);
//num의 인덱스6위치에 3개를 복사
System.arraycopy(abc, 0, num, 6, 3);
System.out.println(num);
}
}
//결과
ABCD
0123456789
01230123456789
ABCD456789
ABCD45ABC9
배열의 활용
총합과 평균
package Array;
public class ArrayEx5 {
public static void main(String[] args) {
int sum=0;
float average = 0f;
int[] score = {100, 88, 100, 100, 90};
for (int i=0; i<score.length; i++) {
sum+=score[i];
}
average = sum / (float)score.length;
System.out.println("총점 : "+sum);
System.out.println("평균 : "+average);
}
}
//결과
총점 : 478
평균 : 95.6
최대값과 최소값
package Array;
public class ArrayEx6 {
public static void main(String[] args) {
int[] score = {79, 88, 91, 33, 100, 55, 95};
int max = score[0];
int min = score[0];
for(int i=1; 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);
}
}
//결과
최대값 : 100
최소값 : 33
섞기(shuffle)
package Array;
public class ArrayEx7 {
public static void main(String[] args) {
int[] numArr = new int[10];
for(int i= 0; i<numArr.length; i++) {
numArr[i] = i;
System.out.print(numArr[i]);
}
System.out.println();
for(int i=0; i<100; i++) {
int n = (int)(Math.random() * 10);
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = tmp;
}
for(int i =0; i<numArr.length; i++){
System.out.print(numArr[i]);
}
}
}
//결과
0123456789
9427580316
임의의 값으로 배열 채우기
package Array;
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);
temp = ball[i];
ball[i] = ball[j];
ball[j] = temp;
}
for(int i = 0; i<6; i++) {
System.out.printf("ball[%d]=%d%n", i, ball[i]);
}
}
}
//결과
ball[0]=37
ball[1]=20
ball[2]=28
ball[3]=1
ball[4]=7
ball[5]=36
임의의 값으로 배열 채우기-2
package Array;
import java.util.Arrays;
public class ArrayEx9 {
public static void main(String[] args) {
int[] code = {-4, -1, 3, 6, 11};
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));
}
}
//결과
[6, 6, 6, 3, -1, 6, 3, 3, 6, 6]
정렬하기(sort)
package Array;
public class ArrayEx10 {
public static void main(String[] args) {
int[] numArr = new int[10];
for(int i=0; i< numArr.length; i++)
System.out.print(numArr[i]=(int)(Math.random()*10));
System.out.println();
for(int i=0; i<numArr.length-1; i++) {
boolean changed = false;
for(int j = 0; j< numArr.length-1-i; j++){
if(numArr[j] > numArr[j+1]) {
int temp = numArr[j];
numArr[j] = numArr[j+1];
numArr[j+1] = temp;
changed = true;
}
}
if(!changed) break; //자리 바꿈이 없으면 반복문을 빠져나간다.
for(int k = 0; k<numArr.length; k++)
System.out.print(numArr[k]);
System.out.println();
}
}
}
//결과
0740894089
0407840899
0047408899
0044078899
0040478899
0004478899
빈도수 구하기
package Array;
public class ArrayEx11 {
public static void main(String[] args) {
int[] numArr = new int[10];
int[] counter = new int[10];
for(int i=0; i<numArr.length; i++) {
numArr[i] = (int)(Math.random()*10);
System.out.print(numArr[i]);
}
System.out.println();
for(int i=0; i<numArr.length; i++) {
counter[numArr[i]]++;
}
for(int i=0; i<numArr.length; i++) {
System.out.println(i+"의 개수 : "+counter[i]);
}
}
}
//결과
9542579250
0의 개수 : 1
1의 개수 : 0
2의 개수 : 2
3의 개수 : 0
4의 개수 : 1
5의 개수 : 3
6의 개수 : 0
7의 개수 : 1
8의 개수 : 0
9의 개수 : 2
출처 : JAVA의 정석 - (남궁성지음)