교실 학생이 10명이 있고, 10명의 영어점수의 평균과 총합계를 구하는 예를 생각해 보자. 10개의 점수를 저장할 변수가 필요한데, 여러 개의 변수를 한 개로 효과적으로 관리할 수 있는 것이 배열이다.
작성 코드
public class Main2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//배열
int[] englishScores = {80,90,30,40,70,95,76,98,100,77};
int sum = 0;
double average = 0.0;
for(int i=0;i<10;i++) {
sum = sum + englishScores[i];
}
System.out.println(sum);
average = (double)sum / (double)englishScores.length;
System.out.println(average);
}
}
위와 같이 int[] englishScore 와 같이 대괄호 []를 사용하여 변수를 선언하면 단순한 변수가 아니라 배열인 변수로 사용할 수 있다. 아래와 같은 방법으로도 사용이 가능하다.
실행 결과
756
75.6
위 프로그램을 실행시킨 결과이다.
작성 코드
int[] englishScores = new int[10];
englishScores[0] = 80;
englishScores[1] = 90;
englishScores[2] = 30;
englishScores[3] = 40;
englishScores[4] = 70;
englishScores[5] = 95;
englishScores[6] = 76;
englishScores[7] = 98;
englishScores[8] = 100;
englishScores[9] = 77;
new int[10] 으로 10개의 저장 공간을 만들었으므로, englishScore[0]부터 시작해서 englishScore[9]까지 총 10개를 사용할 수 있다. 만약 englishScore[10]로 쓰면 0부터 9까지가 10개인데 11번쨰 공간에는 아무것도 없는데 값을 참조하려고 하니까 에러가 난다.
그리고, englishScores.length는 배열의 크기 정보인 10이라는 값이 자동으로 들어가 있어서 사용할 수 있다. 즉, 배열변수.length 형태로 배열크기 정보를 참조한다.
정수가 아닌 double형 배열이나 String형 배열은 아래와 같이 만들 수 있다.
double[] arrayDouble = new double[10];
String[] arrayString = new String[10];
요약하자면, 배열(array)이라는 것은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것으로 많은 양의 값(데이터)을 다룰 때 유용하다.
평균을 구하는 부분을 보면 아래와 같이 정수형 변수인 sum과 length의 앞에 소괄호()로 실수인 double로 변환을 한 부분을 볼 수 있다. 이렇게 괄호로 Type을 변환한 것을 형 변환이라고 한다.
average = (double)sum / (double)englishScoren.length;
형 변환을 하지 않아도 평균을 구할 수 있지만 average = sum / englishScores.length; 이렇게 계산하면 75.6이라는 값이 나오지 않고, 75.0이라고 나온다. 소수점까지 정확한 계산을 하려면 (double)을 사용해 형 변환을 해주면 된다.
한 학교에 학급이 7개가 있는 경우를 생각해보자. 한 학급에 10명의 학생이 있다면 총 70명의 점수를 저장하고, 계산해야 한다. 물론 int[] englishScores = new int[70];으로 70개의 배열을 만들어도 좋지만, 학급과 학급 내 학생을 구분하여 2차원 배열을 사용하는 것이 좋다.
예
int[][] arr2 = new int[3][4];
같이 이차원 배열을 사용하면, 아래 그림과 같이 3*4의 12개의 이차원 배열 저장공간(변수)가 만들어 진다.
| 1번째 칸 | 2번째 칸 | 3번째 칸 | 4번째 칸 |
|---|---|---|---|
| arr2 [0][0] | arr2 [0][1] | arr2 [0][2] | arr2 [0][3] |
| arr2 [1][0] | arr2 [1][1] | arr2 [1][2] | arr2 [0][3] |
| arr2 [2][0] | arr2 [2][1] | arr2 [2][2] | arr2 [2][3] |
작성 코드
public class Main2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] englishScores =
{ {80,90,30,40,70,95,76,98,100,77},
{94,22,34,21,65,23,65,21,66,55},
{30,40,70,95,76,98,100,77,22,66},
{40,70,95,76,98,100,77,100,99,88},
{10,90,30,40,70,95,76,98,67,45},
{89,90,30,40,70,95,76,98,25,78},
{97,90,99,40,70,95,76,98,54,23},
};
int sum = 0;
double average = 0.0;
for(int i=0;i<7;i++) {
for(int j=0;j<10;j++) {
sum = sum + englishScores[i][i];
}
}
System.out.println(sum);
average = (double) sum / 70.0;
System.out.println(average);
}
}
int[][] englishScores = new int[7][10]; 와 같이2차원 배열을 선언하고 나중에 값을 할당하여 사용할 수 있다.
실행 결과
4890
69.85714285714286
앞에서 배운 영어점수의 일차원 배열을 점수가 높은 순부터 내림차순으로 정렬하는 예제를 만들어 보자.
작성 코드
public class Main2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] englishScores = {80,90,30,40,70,95,76,98,100,77};
int temp = 0; // 순서 변경 시 임시로 값을 저장할 때 사용하는 임시 변수
for (int i=0; i < englishScores.length; i++) {
for (int j = i + 1; j < englishScores.length; j++) {
if (englishScores[i] < englishScores[j]) {
//내부의 값을 비교해서 큰 값이 뒤에 있으면 앞뒤값을 바꾼다
temp = englishScores[i];
englishScores[i] = englishScores[j];
englishScores[j] = temp;
}
}
System.out.print(englishScores[i] + " "); // 정렬된 값 출력
}
}
}
실행 결과
100 98 95 90 80 77 76 70 40 30
이번에는 거꾸로 점수가 낮은 순에서 오름차순으로 정렬하려면 어떻게 할까? 아래와 같이 더 작은 값이 앞으로 오도록 부호만 <에서>로 바꾸어 주면 된다!
작성 코드
public class Main2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] englishScores = {80,90,30,40,70,95,76,98,100,77};
int temp = 0;
for (int i = 0; i < englishScores.length; i++) {
for (int j = i +1; j < englishScores.length; j++) {
if (englishScores[i] > englishScores[j]) {
temp = englishScores[i];
englishScores[i] = englishScores[j];
englishScores[j] = temp;
}
}
System.out.print(englishScores[i] + " ");
}
}
}
실행 결과
30 40 70 76 77 80 90 95 98 100
배열을 편하게 상요하기 위해서 기존의 for 반복문 외에 for each 반복문을 사용하게 되면 배열을 다루는데 조금 더 편리함을 제공해 준다.
for (int i=; i<arr.length; i++)
system.out.print(arr[i]+" ")
위와 같은 반복문의 경우, for each 반복문을 사용하면 아래와 같이 줄여서 쓸 수 있다.
for (int e : arr)
system.out.print(arr[i]+" ")
즉, int[] arr = new int[10]; 정수형 배열 arr에 대해서 각각의 원소(element)값을 하나씩 e 변수에 대입을 하여 반복하는 문장이다.
출력 결과는 총합과 평균값으로 이전 for 반복문의 결과와 동일하다.
작성 코드
public class Main2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] englishScores = {80,90,30,40,70,95,76,98,100,77};
int sum = 0;
double average = 0.0;
for(int score : englishScores) {
sum = sum + score;
}
System.out.println(sum);
average = (double)sum / (double)englishScores.length;
System.out.println(average);
}
}
이번 벨로그에서는 배열,이차원배열,형 변환과 for each 반복문에 대해서 살펴보았습니다.