배열
하나의 변수에 같은 종류의 데이터 여러 개를 그룹화 한 형태.
상황 제시
한 학급의 성적표를 보고 각 학생별로 총점과 평균을 구하라.
국어 | 영어 | 수학 | |
---|---|---|---|
철수 | 92 | 81 | 76 |
영희 | 72 | 95 | 84 |
민혁 | 80 | 86 | 98 |
3명씩 3과목이므로 9개의 변수가 필요
int kor1 = 92;
int kor2 = 72;
int kor3 = 80;
// ... 생략 ...
int math1 = 76;
int math2 = 84;
int math3 = 98;
30명의 학생에 대한 20과목에 대한 점수라고 가정한다면 프로그램은 좀 더 복잡해지고 더 많은 변수를 소스코드상에 선언,할당 해야 한다.
#01. 배열
같은 종류의 데이터를 그룹화 한 형태.
배열의 선언
데이터 타입 뒤에 배열임을 의미하는 []
를 명시한다.
int[] a;
배열의 할당
값을 대입하는 것이 아니라 배열의 칸을 결정하는 것임에 유의한다.
new 예약어 뒤에 데이터 타입을 다시 한번 명시하고 배열의 칸 수를 []
를 사용하여 지정한다.
a = new int[3];
선언과 할당의 통합
int a = new int[3];
2) 배열의 활용
크기가 결정된 배열은 0부터 시작되는 일련번호를 부여받는다. 이를 배열의 인덱스라고 한다.
값을 저장하기 위해서는 배열 변수 이름 뒤에 [0]
형식으로 인덱스 번호를 지정하고 대입한다.
a[0] = 10; // 인덱스가 0인 칸에 10을 대입
a[1] = 20; // 인덱스가 1인 칸에 20을 대입
a[2] = 30; // 인덱스가 2인 칸에 30을 대입
즉, 아래와 같이 구성된다고 생각할 수 있다.
0 | 1 | 2 |
---|---|---|
10 | 20 | 30 |
배열에 저장되 값 사용하기.
인덱스 번호를 사용한다는 점을 제외하고는 일반 변수의 사용과 동일하다.
a) 다른 변수에 복사하기
int k = a[0]; // k에 10이 복사됨
b) 출력하기
System.out.println(a[1]); // 20이 출력됨
c) 연산하기
a[2] = a[0] * a[1]; // 인덱스가 2인 공간의 값이 200이 됨
3) 배열의 크기
배열이름.length는 배열의 칸 수를 반환한다.
int [] a = new int[5];
System.out.println(a.length); // 5가 출력됨
배열의 인덱스는 항상
0
부터크기-1
까지 1씩 증가하면서 존재한다.
4) 반복문을 통한 활용
인덱스가 0
부터 크기-1
까지 증가한다는 특성을 활용하여 for문과 함께 사용하면 배열의 모든 원소에 대한 일괄 처리가 가능하다.
int a = new int[4];
for (int i=0; i<a.length; i++) {
a[i] = i * 10;
System.out.println(a[i]);
}
선언+할당+값대입을 한 번에 일괄 처리 하기
배열을 할당할 때 사이즈를 지정하지 않고 중괄호{}
를 열어서 배열의 원소값들을 직접 나열한다.
int[] a = new int[] { 10, 20, 30, 40 };
이 때 new int[]
는 생략할 수 있다.
int[] a = { 10, 20, 30, 40 };
ArraySum.java
배열의 모든 원소에 대한 합 구하기
public class ArraySum {
public static void main (String [] args) {
int[] data = { 10, 20, 30, 40 };
// 총 합을 구할 때는 항상 누적 합산을 수행할 변수를 0으로 초기화 해 놓고 반복을 수행해야 한다.
int sum = 0;
// 배열의 모든 원소에 대한 반복문 구성
for (int i=0; i<data.length; i++) {
sum += data[i];
}
System.out.println(sum);
}
}
출력결과
150
ArrayMax.java
배열의 원소 중에서 가장 큰값 출력하기
public class ArrayMax {
public static void main(String [] args) {
// 원소값을 무작위로 갖는 배열
int[] data = { 5, 2, 7, 9, 2 };
// 비교를 위한 값 준비
int max = 0;
// 배열의 원소 수 만큼 반복
for (int i=0; i < data.length; i++) {
System.out.printf("max=%d, data[%d]=%d\n", max, i, data[i]);
// max가 data의 i번째보다 작다면 i번째 원소를 max에 복사
if (max < data[i]) {
System.out.printf(">> max에 %d를 복사\n", data[i]);
max = data[i];
}
}
System.out.println("최대값 = " + max);
}
}
결과출력
max=0, data[0]=5
>> max에 5를 복사
max=5, data[1]=2
max=5, data[2]=7
>> max에 7를 복사
max=7, data[3]=9
>> max에 9를 복사
max=9, data[4]=2
최대값 = 9
배열 순서 뒤집기
ArratConverse.java
public class ArratConverse {
public static void main(String [] args) {
int[] data = { 1, 5, 2, 4, 3 };
for (int i=0; i<data.length/2; i++) {
// 반대쪽 원소의 인덱스 구하기
int k = data.length - i - 1;
// i번째 원소와 k번째 원소 교환
int tmp = data[i];
data[i] = data[k];
data[k] = tmp;
}
for (int i=0; i<data.length; i++) {
System.out.println(data[i]);
}
}
}
결과출력
3
4
2
5
1
정렬
35214 순서대로 정렬
for (int i=0; i<k.length-1; i++){
for (int j=i+1; j<k.length; k++){
// if 문으로 조건 대입
}
}
ArraySort.java
public class ArraySort{
public static void main(String[] args){
int[] data = { 1, 5, 2, 4, 3 };
// 비교할 기준을 선정하는 반복처리 --> 0번째부터 길이-1 번째까지 (가로)
for (int i=0; i<data.length-1; i++) {
// 기준과 비교할 위치를 선정하는 반복 --> i+1번째부터 길이까지. (세로)
for (int j=i+1; j<data.length; j++) {
// i번째와 j번째를 비교하여 교환 여부를 결정
if (data[i]>data[j]) {
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
}
}
for (int i=0; i<data.length; i++) {
System.out.println(data[i]);
}
}
}
결과출력
1
2
3
4
5