동일한 자료형을 그룹(묶음)으로 저장하는 것으로 생성 시점에 크기를 지정해야 하며 크기가 지정 되면 변경될 수 없다.
✔️ 선언
int[] arr1; int arr2[];
배열을 선언하는 것은 배열을 다루기 위한 참조변수를 위한 공간만 만들어지는 것이고
정말 값이 저장되는 공간이 만들어주기 위해서는 선언한 배열을 생성해주어야 한다.
배열의 저장 구조
✔️ 생성
arr1 = new int[10];
new
: JVM 은 객체 생성에 필요한 메모리 공간을 확보new int[10];
: int(4byte) 타입의 데이터 10개를 저장. 정수 10개를 저장할 수 있는 메모리 공간(40byte) 확보✔️ 데이터 입력
arr1[0] = 10;
✚ 배열을 선언하는 방법은 다양하다
선언과 동시에 생성
int intArray[] = new int[5];
선언, 생성, 초기화
int intArray[] = new int[] {1, 2, 3, 4, 5};
int intArray[] = {1, 2, 3, 4, 5};
기존의 for 문을 변형하여, 배열이나 나열(enumeration)의 크기만큼 루프를 돌면서 각 원소를 순차적으로 접근하는데 유용하게 만든 for 문을 향상된 for 문(for-each 문)이라고 부른다.
배열 n에 들어 있는 모든 정수를 더하는 코드를 향상된 for 문으로 작성하면 다음과 같다.
int [] n = { 1,2,3,4,5 };
int sum = 0;
for (int k : n) {
sum += k;
}
System.out.prinln(sum);
기본 타입(primitive type)
정수, 실수, 문자, 논리 리터럴을 저장하는 타입으로 선언된 변수는 실제 값을 변수 안에 저장한다.
참조 타입(reference type)
객체(Object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말하고, 이를 이용해 선언된 변수는 메모리의 번지를 값으로 갖는다.
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null(널) 값을 가질 수 있다.
int[] arr1 = { 10, 20, 30 };
System.out.println(arr1);
//출력시, [I@6d06d69c
// 참조 자료형 - 메모리 주소값을 공유하고 있는 형태
int[] arr1 = { 10, 20, 30 };
int[] arr2 = arr1;
System.out.println(arr1);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr1[0]);
arr2[0] = 100;
System.out.println(arr2[0]); // 100
System.out.println(arr1[0]); // 100
}
배열 변수는 참조 변수(reference variable)로 취급되며, 해당 변수가 가리키는 배열 데이터는 힙(heap) 영역에 저장된다. 힙 영역은 객체가 생성될 때 동적으로 할당되며, 객체의 크기와 수명은 프로그램의 실행 도중에 결정된다.
배열 데이터가 힙 영역에 저장되는 이유는 배열이 객체이기 때문이다. 배열은 다른 객체와 마찬가지로 인스턴스(instance)로 생성되며, 생성된 인스턴스는 힙 영역에 할당된다. 배열의 각 원소는 힙 영역에서 연속적으로 할당되며, 해당 주소는 배열 변수의 값으로 참조된다.
반면에 배열 변수는 메모리의 스택(stack) 영역에 저장된다. 스택은 함수 호출 시 사용되는 지역 변수(local variable)들과 함께 사용되며, 변수의 수명은 함수 실행 중에만 유지된다. 배열 변수는 해당 배열을 가리키는 포인터 역할을 하며, 해당 배열이 생성된 힙 영역의 주소를 참조한다.
이렇게 힙 영역에 배열 데이터를 저장함으로써 동적 메모리 할당이 가능해진다. 배열의 크기를 실행 중에 결정할 수 있으므로, 프로그램의 유연성을 높일 수 있다(배열의 크기를 코드 작성 시점이 아니라 실행 시점에 결정할 수 있다는 의미). 또한, 힙 영역은 가비지 컬렉터에 의해 자동으로 관리되므로, 메모리 누수나 불필요한 메모리 사용을 방지할 수 있다.