배열
배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
중요한 것은 같은 타입이며, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.
한 학급의 시험 점수를 저장하는 경우가 배열을 사용하기 좋은 예다. 배열 없이는 학생 5명의 점수를 저장하기 위해 아래와 같이 5개의 변수를 저장한다.
int score1, score2, score3, score4, score5
int[] score = new int[5]
값을 저장 할 수 있는 공간은 score[0]부터 score[4]까지 모두 5개이며, 변수 score는 배열을 다루는데 필요한 참조변수일 뿐 값을 저장하기 위한 공간은 아니다.
배열의 선언과 생성
타입[] 변수이름;
변수이름 = new 타입[길이];
int[] score;
score = new int[5];
배열의 길이와 인덱스
생성된 배열의 각 저장공간은 '배열이름[인덱스]' 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.
int[] score = new int[5]; // 길이가 5인 int 배열
score[3] = 100; // 배열 score의 4번째 요소에 100을 저장한다.
int value = score[3]; // 배열 score의 4번째 요소에 저장된 값을 읽어서 value에 저장
배열을 다룰 때 for문은 거의 필수적이다.
score[0] = 0;
score[1] = 10;
score[2] = 20;
score[3] = 30;
score[4] = 40;
for(int i=0; i<5; i++)
{
score[i] = i*10;
}
배열의 출력
int[] arr = {100, 95, 80, 70, 60};
// 배열의 요소를 순서대로 하나씩 출력
for(int i=0; i<arr.length; i++)
{
System.out.print(arr[i] + ", ");
}
100, 95, 80, 70, 60,
public static void main(String[] args) {
int[] arr1 = new int[10];
int[] arr2 = new int[10];
int[] arr3 = new int[] {100, 95, 80, 70, 60};
int[] arr4 = {100, 95, 70, 60};
char[] chArr = {'a', 'b', 'c', 'd'};
for(int i=0; i<arr1.length; i++)
{
arr1[i] = i+1; // 1-10을 순서대로 배열에 넣는다
}
for(int i=0; i<arr2.length; i++)
{
arr2[i] = (int)(Math.random()*10)+1; // 1-10을 랜덤으로 배열에 넣는다
}
for(int i=0; i<arr1.length; i++)
{
System.out.print(arr1[i] + ","); // 배열에 저장된 값을 출력한다
// 1,2,3,4,5,6,7,8,9,10,
}
System.out.println();
System.out.println(Arrays.toString(arr2)); // [9, 8, 4, 8, 6, 5, 1, 9, 7, 6]
System.out.println(Arrays.toString(arr3)); // [100, 95, 80, 70, 60]
System.out.println(Arrays.toString(chArr)); // [a, b, c, d]
System.out.println(arr3); // [I@4517d9a3
System.out.println(chArr); // abcd
}
배열의 복사
배열은 한 번 생성하면 그 길이를 변경할 수 없기에 더 많은 저장 공간이 필요하다면 더 큰 배열을 만들고 이전 배열로부터 내용을 복사해야 한다.
배열을 복사하는 방법은 두 가지가 있는데, for문을 이용해 배열을 복사하는 방법은 다음과 같다.
public static void main(String[] args) {
int[] arr = new int[5];
int[] tmp = new int[arr.length*2]; // 기존 배열보다 2배인 배열 생성
for(int i=0; i<arr.length; i++)
tmp[i] = arr[i]; // arr[i]의 값을 tmp[i]에 저장
arr = tmp; // 참조변수 arr이 새로운 배열을 가리키게 한다
}
int[] tmp = new int[arr.length*2];
int[] tmp = new int[5*2];
int[] tmp = new int[10];
되도록이면 처음부터 배열 길이를 넉넉하게 잡아 새로 배열을 생성해야 하는 상황이 가능한 적게 해야 한다. 그렇다고 배열의 길이를 너무 크게 잡으면 메모리를 낭비하게 되므로, 기존의 2배 정도의 길이로 배열을 생성하는 것이 좋다.
변경 전
arr.length: 5
arr[0]: 1
arr[1]: 2
arr[2]: 3
arr[3]: 4
arr[4]: 5
변경 후
arr.length: 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
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];
// 배열 arr에 저장된 값들을 배열 tmp에 복사한다
for(int i=0; i<arr.length; i++)
tmp[i] = arr[i];
// tmp에 저장된 값을 arr에 저장한다
arr = tmp;
System.out.println();
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]);
}
for문 보다 System.arraycopy()를 사용하면 더 간단하게 배열을 복사할 수 있다.
// for
for(int i=0; i<num.length; i++)
{
newNum[i] = num[i];
}
// arrarycopy
System.arraycopy(num, 0, newNum, 0, num.length);
배열 예제
1. 총합과 평균
총점: 478
평균: 95.6
public static void main(String[] args) {
int sum = 0; // 총점 저장 변수
double avg = 0.0; // 평균 저장 변수
int[] score = {100, 88, 100, 100, 90};
// 반복문 이용해 배열에 저장되어 있는 값 모두 더한다
for(int i=0; i < score.length; i++)
{
sum += score[i];
}
avg = sum / (double)score.length; // 계산 결과를 double로 얻기 위한 형변환
System.out.println("총점: " + sum);
System.out.println("평균: " + avg);
}
2. 최대값과 최소값
최대 값: 100
최소 값: 33
public static void main(String[] args) {
int score[] = {79, 88, 91, 33, 100, 55, 95};
int max = score[0]; // 배열의 첫 번째 값으로 최대 값을 초기화 한다
int min = score[0]; // 배열의 첫 번째 값으로 최소 값을 초기화 한다
// 배열의 두 번째 요소부터 읽기 위해 변수 i 값을 1로 초기화
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);
}
3. 섞기(shuffle) : 배열의 요소의 순서를 반복해서 바꾼다 (카드 섞기, 로또 번호 생성)
0123456789
1839507642
public static void main(String[] args) {
int[] numArr = new int[10];
for(int i=0; i < numArr.length; i++)
{
numArr[i] = i; // 배열을 0-9 숫자로 초기화 한다
System.out.print(numArr[i]); // 0123456789
}
System.out.println();
for(int i=0; i<100; i++)
{
int n = (int)(Math.random()*10); // 0-9 중의 한 값을 임의로 얻는다
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = tmp;
}
for(int i=0; i < numArr.length; i++)
System.out.print(numArr[i]); // 1839507642 → 임의로 섞는다
}
4. 섞기2
ball[0]=22
ball[1]=32
ball[2]=34
ball[3]=10
ball[4]=25
ball[5]=43
public static void main(String[] args) {
int[] ball = new int[45]; // 정수 45개 저장하는 배열
// 배열의 각 요소에 1-45의 값 저장한다
for(int i=0; i < ball.length; i++)
ball[i] = i+1; // ball[0]에 1이 저장 된다
int temp = 0; // 두 값을 바꾸는데 사용할 임시 변수
int j = 0; // 임의의 값을 얻어서 저장할 변수
// 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 섞는다
// 0번째 부터 5번째 요소까지 모두 6개만 바꾼다
for(int i=0; i < 6; i++)
{
j = (int)(Math.random()*45);
temp = ball[i];
ball[i] = ball[j];
ball[j] = temp;
}
// 배열 ball의 앞에서부터 6개의 요소 출력한다
for(int i=0; i < 6; i++)
System.out.printf("ball[%d]=%d%n", i, ball[i]);
}
로또 번호를 생성하는 예제이다.
길이가 45인 배열에 1부터 45까지의 값을 담고, 반복문을 이용해 배열의 ball[i]와 random()에 의해 결정된 임의의 위치에 있는 값과 자리를 바꾸는 것을 6번 반복한다.
마치, 1부터 45까지 번호가 쓰인 카드를 섞은 후 맨 위의 6장을 꺼내는 것과 같다. 45개의 요소 중에서 앞의 6개의 요소만 임의의 위치에 있는 요소와 자리를 바꾼다.
5. 빈도 수 구하기
5 7 2 8 7 2 0 5 4 0
0의 개수: 2
1의 개수: 0
2의 개수: 2
3의 개수: 0
4의 개수: 1
5의 개수: 2
6의 개수: 0
7의 개수: 2
8의 개수: 1
9의 개수: 0
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); // 0-9 사이의 임의의 값으로 초기화
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]);
}
}
for(int i=0; i < numArr.length; i++)
{
counter[numArr[i]]++;
}
counter[numArr[i]]++;
→ counter[numArr[0]]++; // i의 값이 0인 경우를 가정하면
→ counter[4]++; // numArr[0]의 값은 4이다 → counter[4]의 값을 1 증가시킨다
String 배열
1. String 배열의 선언과 생성
String[] name = new String[3];
2. String 배열의 초기화
String[] name = new String[3];
// 1
name[0] = "Kim";
name[1] = "Park";
name[2] = "Yi";
// 2
String[] name = {"Kim", "Park", "Yi"};
names[0]:Kim
names[1]:Park
names[2]:Yi
Yu Park Yi
public static void main(String[] args) {
String[] names = {"Kim", "Park", "Yi"};
for(int i=0; i < names.length; i++)
System.out.println("names[" + i + "]:" + names[i]);
names[0] = "Yu"; // 배열 names의 1번째 요소를 Yu로 변경
for(String str : names)
System.out.print(str + " ");
}
3. char 배열과 String 클래스
String 클래스는 char 배열에 기능(메소드)를 추가한 것이다.
char 배열과 String 클래스의 중요한 차이는 String 객체는 읽을 수만 있을 뿐 내용을 변경할 수 없다.
String str = "Java";
str = str + "8";
System.out.println(str); // "Java8" → 변경된 게 아니라 문자열이 합쳐진다
char 배열과 String 클래스의 변환
char[] chArr = ['A', 'B', 'C'};
String str = new String(chArr); // char배열 → String
char[] temp = str.toCharArray(); // String → char배열
src.charAt(0):A
src.charAt(1):B
src.charAt(2):C
src.charAt(3):D
src.charAt(4):E
ABCDE
public static void main(String[] args) {
String src = "ABCDE";
for(int i=0; i < src.length(); i++)
{
char ch = src.charAt(i); // src의 i번째 문자를 ch에 저장
System.out.println("src.charAt(" + i + "):" + ch);
}
// String → char[]
char[] chArr = src.toCharArray();
// char[] 출력
System.out.println(chArr);
}