배열은 같은 자료형을 묶어 저장하는 참조자료형이다.
배열은 생성할 때 주의할 점으로 두가지가 있다.
① 크기를 지정해야한다. ② 지정한 크기를 절대 변경할 수 없다는 특징을 가진다.
배열을 선언하는 방법은 2가지가 있다.
int[] array;
처럼 자료형 뒤에 [ ]로 표시하거나
char array[];
처럼 변수명 뒤에 [ ]로 표시할 수 있다.
😕 array
자료형으로 만들면 편했을텐데 왜 안그럴까??
😀 배열은 동일한 자료형만 묶을 수 있는데,
array
로 적어두면 어떤 자료형끼리 묶은건지 알 수 없다.
배열에 값을 할당하는 방법은 변수랑 동일하다.
단, new 키워드를 함께 사용해야하며 배열의 길이를 지정하지 않으면 오류가 발생한다.
// 자료형 변수명[] = new 자료형[배열의 길이];
String studentArray[];
student = new String[3];
int array[] = new int[5]; // int형 배열로 길이는 5다.
char array2[] = new char[2]; // char형 배열로 길이는 2다.
String array3[] = new String[4]; // String 배열로 길이는 4다.
// 배열의 길이를 지정하지 않았을 경우
int numArr[] = new int[]; // 오류 발생
배열에 값을 할당하는 방법을 간단하게 알아보자
// 배열 객체를 생성하고 각 인덱스 위치마다 값 대입
int[] a = new int[3];
a[0] = 3;
a[1] = 5;
a[2] = 1;
// 배열 객체를 생성하고 함께 값 대입하기
int[] b = new int[] {1, 2, 3, 4};
int[] c = {1, 2, 3, 4, 5};
// 배열 객체를 생성하고 for문으로 인덱스 위치 접근해서 값 대입
int[] d = new int[5];
for(int i=0; i<d.length; i++){
d[i] = i++;
}
모든 참조 자료형의 실제 데이터(객체)는 Heap 영역에 저장된다. (new 키워드)
따라서 배열 자료형 변수의 저장공간에는 객체의 주소값을 가지고 객체는 실제 Heap영역에 저장된다. (배열 공간의 주소를 이용해 인덱스를 참조)
위의 그림에서 array 변수
는 참조변수라고 불린다.
😵💫 변수에 빈 값을 할당하면 오류가 나는데, 배열은 왜 오류가 안날까?
😀 배열의 길이를 지정하고 값을 넣지않아도 오류가 나지않는다.
그 이유는 스택 영역은 값을 초기화하지 않으면 빈 공간으로 인식해 변수를 출력하면 오류가 발생한다.
하지만 힙 영역은 어떤 상황에서도 빈 공간이 존재하지 않는다.
그래서 값을 주지 않아도 컴파일러가 값을 강제로 초기화하기 때문이다.
(정수형 = 0, 실수형 = 0.0, 문자열 = null, 문자 = ' ', 불값 = false)
기본 자료형과 참조 자료형에서 복사할 때를 알아보자
기본 자료형은 '='을 사용해 값을 복사할 때 변수에 포함된 스택 영역의 실제 데이터 값을 복사한다. 그래서 기본 자료형 변수를 복사하면 실제 데이터 값이 1개 더 복사되는 것이다.
int a = 3;
int b = a; // a의 값은 3 b의 값은 3
b = 7; // a의 값은 3 b의 값은 7
반면 참조 자료형은 스택 영역에 실제 데이터 값이 아닌 힙 영역에 저장된
객체의 주소 값을 저장한다.
따라서 참조 자료형 변수를 복사하면 실제 데이터 값이 복사되는게 아닌 실제 데이터의 주소 값이 복사된다.
그래서 참조 자료형 변수 데이터를 수정하면 다른 참조 변수가 가르키는 데이터도 함께 변한다. (원본 값을 공유)
int[] a = {3, 4, 5}; // a 주소 값 : 0x111
int[] b = a; // b 주소 값 : 0x111
b[0] = 7; // b 주소 값 : 0x111에 0번째 인덱스 값 변경
System.out.print(a[0]); // 7 출력
System.out.print(b[0]); // 7 출력
위의 문제점을 해결하는 방법으로 새로운 배열을 생성해서 기존 데이터를 복사하면 된다.
새로운 배열에 기존 배열 값을 넣는 방법을 알아보자
// for문을 이용
int arr1[] = {100, 200, 300};
int arr2[] = new int [arr1.length];
for(int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
System.out.print(arr1[i] + " ") // 100 200 300
System.out.print(arr2[i] + " ") // 100 200 300
}
// Arrays.copyof 이용
// 자료형 변수명[] = Arrays.copyOf(복사할 참조변수, 복사할 길이)
String name1[] = {"선인장", "무궁화", "제비꽃"};
String name2[] = Arrays.copyOf(name1, name1.length);
for(int i = 0; i < name1.length; i++) {
System.out.print(name1[i] + " ") // 선인장 무궁화 제비꽃
System.out.print(name2[i] + " ") // 선인장 무궁화 제비꽃
}