배열(Array)
이란, 같은 타입의 변수들로 이루어진 유한 집합으로 배열을 구성하는 각각의 값을요소(Element)
라고하며, 배열에서의 위치를 가르키는 말을인덱스(Index)
라고 합니다.
int[] arr;
int arr[];
두 가지 방법이 있는데 두개 다 동일하게 동작한다.
JAVA
가 권장하는 방법은 첫번째 방법이다.
이유는 두번째 방법이 C언어와 호환이 되기 때문이다. 하지만 사람들이 익숙한 것에 더 편리함을 느껴 JAVA는 두개 다 사용이 가능하도록 해놓았다.
arr = new int[3];
// 3개의 배열 공간을 열겠다. [] 안에 적어준 숫자만큼 변수를 만든다.
int[] arr = new int[3]
// 선언+생성 꼭 함께 해줘야 한다.
배열 요소(Element)란 배열로 관리되는 각각의 변수를 뜻한다.
모든 배열 요소는 자동으로 초기화 된다. (어떤 값을 가진다.)
예를들어
int a;
System.out.println(a);
위의 코드는 사용할 수 없는 garbage
쓰레기 값을 가진다. (사용할 수 없는 값)
그래서 위의 코드를 출력하려고 시도할 경우 빨간줄로 오류가 뜰 것이다.
하지만, 배열은 '값이 없음'을 의미하는 0
, 0.0
, false
, null
값을 가진다.
int[] arr = new int[3]
arr[0] // 0
arr[1] // 0
arr[2] // 0
변수 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]);
}
일반 변수를 3개를 선언하게 되면 다 따로 따로 선언해주어야 하지만,
배열은 한 변수에 세개의 데이터를 모아 담아서 for문을 통해 인덱스(index) 값을 받아 출력할 수 있다.
그리고 되도록이면 배열의 for문 안에는 변수이름을 Index
를 뜻하는 i
를 사용하는게 좋다.
만약 i
를 못쓰는 상황이면 j
, k
를 사용한다.
배열을 생성-선언 하고 따로 값을 할당하지 않고, 선언과 함께 초기화 할 수 있다.
int[] arr = {값, 값, 값, ...};
반 친구들의 시험 성적 평균 구하기. ( A친구는 100점, B친구는 50점, C친구는 80점이다.)
int[] arr = new int[3];
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); // 0, 0, 0
// 자동으로 초기화가 돼서 값을 설정하지 않아도 0이 할당되어 있다.
}
arr[0] = 100;
arr[1] = 50;
arr[2] = 80; // 각 Index에 값을 선언한다.
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;
System.out.println("평균 : " + average + "점");
arr의 요소중에 최대값과 최소값을 구하시오.
첫번째 방법
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);
System.out.println("최소 : " + min);
두번째 방법
int max = arr[0];
int min = arr[0];
Arrays.sort(arr);
max = arr[arr.length-1];
min = arr[0];
System.out.println("최대 : " + max);
System.out.println("최소 : " + min);
Arrays.sort()
는 배열안의 숫자를 오름차순으로 정렬해준다.
백준 열심히 풀다가 알게된건데 쓰기 편하고 코드 결합도도 낮은편이라 유용하다.
배열의 길이를 늘리는 방법을 이해하려면 배열이 데이터베이스에 어떻게 저장이 되는지에 대해 먼저 이해를 해야한다.
배열이 데이터베이스에 저장되는 원리를 먼저 살펴보자.
int[] arr = {10, 20, 30, 40};
1차원 배열을 선언하게 되면, 같은 배열에 있는 값들은 모두 하나의 참조 주소값을 가지고
index
로 서로 상대적인 위치를 가진다.
배열의 길이를 늘리기 전에 먼저 알아두어야 할 사항이 있다.
배열의 길이는 변경을 할 수 없다.
그래서 우리는 새로운 배열을 만들어서 기존의 값을 새로운 배열에 옮겨줄 것이다.
예를들어 1000개의 데이터를 수용하는 "temp" 이라는 배열을 선언하고 arr의 데이터를 옮겨 주고 arr이 temp의 주소값을 따른다면,
arr의 요소(Element)들은 메모리누수
상태가 된다.
데이터 베이스 내부에서는 arr의 참조주소
만 temp의 참조주소
로 바꿔주면 된다.
길이가 4인 배열을 사용하다가 길이가 1000인 배열로 바꾸기
// 1. 늘어난 길이의 새로운 배열 만들기
int[] arr = {1,2,3,4}; // 기존 배열
int[] temp = new int[1000]; // 새로운 배열
// 2. 기존 배열의 값을 모두 새로운 배열로 옮긴다.
System.arraycopy(arr, 0, temp, 0, arr.length);
// 3. 기존배열의 참조값을 새로운 배열의 참조값으로 수정한다.
arr = temp;
// 이제 arr배열의 길이는 1000 이다.
System.out.println(arr.length);
System.out.println(Arrays.toString(arr));
배열을 선언하고, 향상된 for문으로 간단하게 배열의 내용을 출력할 수 있다.
보기대로 출력하시오.
보기 :
1번째 친구 - 라이언
2번째 친구 - 프로도
3번째 친구 - 어피치
일반 for문
String[] friends = {"라이언", "프로도", "어피치"};
for(int i=0; i<friends.length; i++) {
System.out.println( (i+1) + "번째 친구 - " + friends[i]);
}
// 1번째 친구 - 라이언
// 2번째 친구 - 프로도
// 3번째 친구 - 어피치
}
향상 for문
String[] friends = {"라이언", "프로도", "어피치"};
for(String friend : friends) {
System.out.println(friend);
}
friends 배열의 모든 요소를 하나씩 String friend로 옮긴다.
- 1차원 배열을 여러개 관리하는 자료구조
- 1차원 배열들의 길이는 서로 다를 수 있음
int[][] arr; // n차원 배열일 경우, n개의 개수만큼 대괄호[] 를 생성해주면 된다.
int[][] arr;
// 1차원 배열들의 길이가 같은 경우
arr = new int[3][2]; // 3행 2열의 구조(김밥 3줄, 각 2개씩 조각)
// 1차원 배열들의 길이가 다른 경우
arr = new int[3][]; // 3행 n열의 구조(김밥 3줄, 모두 다르게 조각)
arr[0] = new int[5]; // 1번째 1차원배열(1 번째 김밥은 5개 조각)
arr[1] = new int[3]; // 2번째 1차원배열(2 번째 김밥은 3개 조각)
arr[2] = new int[8]; // 3번째 1차원배열(3 번째 김밥은 8개 조각)
- 인덱스를 2개 사용
arr[1][0]
각각 "몇 번째 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();
}
시간표 나타내기
시간표
String[][] timeTable = {
{"국어", "윤리", "수학", "영어"},
{"미술", "수학", "과학"},
{"체육", "사회", "수학", "영어"},
{"국어", "한자", "문학", "수학", "영어"},
{"음악", "국어", "수학", "영어"}
};
일반 for문
String[][] timeTable = {
{"국어", "윤리", "수학", "영어"},
{"미술", "수학", "과학"},
{"체육", "사회", "수학", "영어"},
{"국어", "한자", "문학", "수학", "영어"},
{"음악", "국어", "수학", "영어"}
};
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[][] timeTable = {
{"국어", "윤리", "수학", "영어"},
{"미술", "수학", "과학"},
{"체육", "사회", "수학", "영어"},
{"국어", "한자", "문학", "수학", "영어"},
{"음악", "국어", "수학", "영어"}
};
for(String[] weekName : timeTable) {
for(String course : weekName) {
System.out.print(course + " ");
}
System.out.println();
}