같은 자료형의 변수 여러 개를 하나의 묶음으로 만들어 하나의 이름으로 다루는 것을 배열이라고 한다.
자바에서는 배열 공간은 자유 메모리 영역인 Heap 영역에 할당하도록 지정되어 있으며, 배열변수는 할당된 배열공간의 주소를 저장하며, 배열공간의 주소를 이용해 인덱스(순번, index)를 참조하는 방식으로 값들을 처리하도록 정해두었다.
배열공간의 주소 저장용 참조(Reference) 변수를 만드는 것
💡 자료형[] 배열명; // int[] arr; 자료형 배열명[]; // int arr[];Heap 영역에 값을 저장하는 변수들을 연속 나열 할당하고, 발생한 배열 공간의 시작주소를 선언된 배열 레퍼런스에 대입한다.
💡 배열참조변수 = new 자료형 [배열크기];arr[0] = 1;
arr[1] = 2;
for(int i = 0; i < arr.length; i++) {
arr[i] = i;
}
int[] arr = {1, 2, 3, 4, 5};
int[] arr = new int[] {1, 2, 3, 4, 5};
// arr[0] = 1;
// arr[1] = 2; ...
String fruit[] = {”사과”, “포도”, “참외”};
// fruit[0] = “사과”;
// fruit[1] = “포도”;
// fruit[2] = “참외”;
객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는 것
💡 int[] arr1 = new int[4]; int[] arr2 = arr1;public void ShallowCopy() {
String originArr[] = {"Apple", "Banana", "Orange"};
String destArr[]; // 배열의 주소 복사용 배열 레퍼런스 선언
destArr = originArr; // 주소 복사
for(int i = 0; i < 3; i++) {
System.out.println(originArr[i] + " : " + destArr[i]);
}
System.out.println("================");
originArr[1] = "Pineapple"; // 원본 배열 2번째 인덱스의 값 수정
for(int i = 0; i < 3; i++) {
System.out.println(originArr[i] + " : " + destArr[i]);
}
}
// 결과
Apple : Apple
Banana : Banana
Orange : Orange
================
Apple : Apple
Pineapple : Pineapple
Orange : Orange
얕은 복사는 원본 배열의 값을 바꾸면, 복사한 배열의 값도 같이 바뀐다.
새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것
public void DeepCopy() {
String originArr[] = {"Apple", "Banana", "Orange"};
String destArr[];
destArr = new String[originArr.length];
for(int i = 0; i < originArr.length; i++) {
destArr[i] = originArr[i];
}
originArr[1] = "Pineapple";
for(int i = 0; i < originArr.length; i++) {
System.out.println(i + " : " + originArr[i] + ", " + destArr[i]);
}
}
// 결과
0 : Apple, Apple
1 : Pineapple, Banana
2 : Orange, Orange
깊은 복사는 원본 배열의 값을 바꿔도 복사한 배열의 값은 바뀌지 않는다.
public void ArrayCopy() {
String originArr[] = {"Apple", "Banana", "Orange"};
String destArr[] = new String[originArr.length];
System.arraycopy(originArr, 0, destArr, 0, originArr.length);
for(int i = 0; i < destArr.length; i++) {
System.out.println(i + " : " + originArr[i] + ", " + destArr[i]);
}
}
// 결과
0 : Apple, Apple
1 : Banana, Banana
2 : Orange, Orange
import java.util.Arrays;
public void ArraysCopyOf() {
String originArr[] = {"Apple", "Banana", "Orange"};
String destArr[] = new String[originArr.length];
destArr = Arrays.copyOf(originArr, originArr.length);
for(int i = 0; i < destArr.length; i++) {
System.out.println(i + " : " + originArr[i] + ", " + destArr[i]);
}
}
// 결과
0 : Apple, Apple
1 : Banana, Banana
2 : Orange, Orange
public void cloneCopy() {
String originArr[] = {"Apple", "Banana", "Orange"};
String destArr[] = new String[originArr.length];
destArr = originArr.clone();
for(int i = 0; i < destArr.length; i++) {
System.out.println(i + " : " + originArr[i] + ", " + destArr[i]);
}
}
// 결과
0 : Apple, Apple
1 : Banana, Banana
2 : Orange, Orange
자료형이 같은 1차원 배열의 묶음으로 배열 안에 다른 배열이 존재한다.
2차원 배열은 할당된 공간마다 인덱스 번호가 두 개 부여된다.(앞 번호는 행, 뒷 번호는 열([0][0]))
arr[0][0] = 1;
arr[1][1] = 2;
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
arr[i][j] = j;
}
}
int[][] arr = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int[][] arr = new int[][] {{1, 2, 3, 4}, {5, 6, 7, 8}};
String fruit[][] = {{"사과", "딸기", "석류"}, {"바나나", "참외", "레몬"}};
public void TestTwoVriableArray() {
int score[][] = new int[3][]; // 가변배열
score[0] = new int[] {1, 2, 3, 4, 5};
score[1] = new int[] {12, 24, 36};
score[2] = new int[] {11, 22, 33, 44};
for(int i = 0; i < score.length; i++) {
for(int j = 0; j < score[i].length; j++) {
System.out.print(i + "행" + j + "열 : " + score[i][j] + "\t");
}
System.out.println();
}
}
// 결과
0행0열 : 1 0행1열 : 2 0행2열 : 3 0행3열 : 4 0행4열 : 5
1행0열 : 12 1행1열 : 24 1행2열 : 36
2행0열 : 11 2행1열 : 22 2행2열 : 33 2행3열 : 44