- 한 번에 많은 메모리 공간을 할당해서 여러 개의 값을 저장하는 자료 구조 (Data Structure)
- 여러 개의 변수를 하나의 이름으로 관리하는 자료 구조
- 같은 데이터 타입의 자료들을 순차적으로 저장
- 구성 요소
- 인덱스(Index) : 각 변수의 위치 정보. 0부터 시작
- 배열명 : 모든 변수를 관리하는 하나의 이름
- 각 변수는 배열명에 대괄호 [ ]와 인덱스를 붙여서 구분
배열의 필요성
메모리에 순차적으로 저장되지 않아 모든 변수에 개별 접근해야 한다.
int a, b, c, d, e; |-------|
total += a; d | 8 |
total += b; |-------|
total += c; |-------|
total += d; b | 6 |
total += e; |-------|
|-------|
e | 9 |
|-------|
a | 5 |
|-------|
| |
|-------|
c | 7 |
|-------|
메모리에 순차적으로 저장되어 인덱스를 이용한 순차접근이 가능하다
int[] arr = new int[5]; |-------|
for(int i = 0; i < arr.length; i++) { arr[0] | 5 |
total += arr[i]; |-------|
} arr[1] | 6 |
|-------|
arr[2] | 7 |
|-------|
arr[3] | 8 |
|-------|
arr[4] | 9 |
|-------|
1차원 배열 선언 / 생성 / 초기화
배열 선언
int[] arr;
→ 이 방식을 사용하는게 좋다.int arr[];
→ c언어 호환때문에 이것도 지원배열 생성
arr = new int[3];
int size = 5; arr = new int[size]
배열 선언 및 생성
int[] arr = new int[3];
배열의 초기화
int[] arr = new int[] {10, 20, 30, 40, 50};
int[] arr = {10, 20, 30, 40, 50};
배열의 길이
배열 요소 (Element)
arr[0]
arr[1]
arr[2]
0, 0.0, false, null 등
- 배열의 참조 타입 (Reference Type)
int[] arr = {1, 2, 3};
배열의 장점
int a, b, c;
System.out.println(a);
System.out.println(b);
System.out.println(c);
int[] arr = new int[3];
for(int i = 0; i <3; i++) {
System.out.println(arr[i]);
}
값을 초기화하지 않았는데 오류가 뜨지 않았다.
WHY? 이미 0으로 값을 가지고 있기 때문이다.
int[] arr = new int[3];
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); /* 0
} 0
0 */
배열의 길이(length)가 3이다.
코드 작성할 때 숫자 그대로 3
으로 작성하면, 배열의 길이가 변경될 때마다 수작업으로 변경해줘야 하기 때문에 arr.length
으로 작성해주면 좋다.
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 50;
arr[2] = 80;
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); /* 100
} 50
80 */
int total = 0;
for (int i = 0; i < arr.length; i++) {
total += arr[i];
}
double average = (double)total / arr.length;
// total이 int이기 때문에 double로 캐스팅함
System.out.println("평균 : " + average + "점"); //평균 : 76.66666666666667점
최대 / 최소 구하기
int[] arr = {10, 20, 30, 40, 50};
int max = arr[0];
int min = arr[0];
for(int i = 1; i < arr.length; i++) {
if(max < arr[i]) {
max = arr[i];
}
if(min > arr[i]) {
min = arr[i];
}
}
System.out.println("최대 : " + max); // 최대 : 50
System.out.println("최소 : " + min); // 최소 : 10
배열의 데이터타입
int[]
: 참조 타입 (Reference Type)
/*
int[] arr = { 10000, 20000, 30000 };
|-------|
arr | 0x123 |
|-------|
| ... |
|-------|
arr[0] | 10000 | 0x123 // 메모리를 연속된 공간을 사용한다.
|-------| // 인덱스는 상대적으로 떨어진 위치를 말한다.
arr[1] | 20000 |
|-------|
arr[2] | 30000 |
|-------|
*/
배열의 길이 늘리기
/*
|-------| arr = arr2 |-------|
arr | 0x123 | arr2 | 0x456 |
|-------| |-------|
| ... | | ... |
|-------| |-------|
arr[0] | 10000 | 0x123 | | 0x456
|-------| | |
arr[1] | 20000 | | |
|-------| | |
arr[2] | 30000 | | |
|-------| |-------|
*/
길이가 5인 배열을 사용하다가, 길이가 1000인 배열로 바꾸기
import java.util.Arrays;
public class Ex_array {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
// 늘어난 길이의 새로운 배열을 만들고,
int[] temp = new int[1000];
// 기존 배열의 값을 모두 새로운 배열로 옮기고,
System.arraycopy(arr, 0, temp, 0, arr.length);
// 기존 배열의 참조값을 새로운 배열의 참조값으로 수정한다.
arr = temp;
// 이제 arr 배열의 길이는 1000이다.
System.out.println(arr.length); // 1000
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5, 0, 0, ... 0, 0]
}
}
1번째 친구 - 라이언
2번째 친구 - 프로도
3번째 친구 - 어피치
String[] friends = {"라이언", "프로도", "어피치"};
for(int i = 0; i < friends.length; i++) {
System.out.println((i+1) + "번째 친구 - " + friends[i]);
}
for(String friend : friends) {
// friends 배열의 모든 요소를 하나씩 String friend로 옮긴다.
System.out.println(friend); /* 라이언
} 프로도
어피치 */
2차원 배열의 선언 / 생성 / 초기화
정방형 배열 선언
int[][] arr;
, int arr[][];
정방형 배열 생성
arr = new int[3][5];
정방형 배열의 초기화
int[][] arr = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}
};
비정방형 배열의 선언
int[][] arr;
, int arr[][];
비정방형 배열의 생성
arr = new int[3][]; // 최초 열 개수의 지정이 없음
arr[0] = new int[5]; // 1행은 5열
arr[1] = new int[3]; // 2행은 3열
arr[2] = new int[4]; // 3행은 4열
int[][] arr = {
{1, 2, 3, 4, 5},
{6, 7, 8},
{9, 10, 11, 12} };
2차원 배열의 메모리 구조
int[][] arr = { {1, 2, 3}, {4, 5}}
2차원 배열 요소
arr[0]
arr[1]
arr[2]
arr[0][0] , arr[0][1]
arr[1][0] , arr[1][1]
arr[2][0] , arr[2][1]
3행 2열 2차원 배열
int[][] arr1 = new int[3][2];
for(int i = 0; i < arr1.length; i++) { // i : 몇 번째 1차원 배열인가?
for(int j = 0; j < arr1[i].length; j++) { // j : 1차원 배열의 몇 번째 요소인가?
System.out.print(arr1[i][j] + " ");
}
System.out.println(); /* 0 0
} 0 0
0 0 */
3행 n열 2차원 배열
int[][] arr2 = new int[3][];
arr2[0] = new int[5]; // 1번째 1차원 배열의 길이는 5
arr2[1] = new int[4]; // 2번째 1차원 배열의 길이는 4
arr2[2] = new int[8]; // 3번째 1차원 배열의 길이는 8
for(int i = 0; i < arr2.length; i++) {
for(int j =0; j < arr2[i].length; j++) {
System.out.print(arr2[i][j] + " ");
}
System.out.println(); /* 0 0 0 0 0
} 0 0 0 0
0 0 0 0 0 0 0 0 */
국어 윤리 수학 영어
미술 수학 과학
체육 사회 수학 영어
국어 한자 문학 수학 영어
음악 국어 수학 영어
for(int i = 0; i < timeTable.length; i++) {
for(int j = 0; j < timeTable[i].length; j++) {
System.out.print(timeTable[i][j] + " ");
}
System.out.println();
}
for(String[] weekName : timeTable) {
for(String course : weekName) {
System.out.print(course + " ");
}
System.out.println();
}