3단계 배열 자료형 변수에 객체 대입하기
선언된 배열 참조 자료형 변수에 생성한 객체를 대입하는 데는 2가지 방법이 있는데, 변수 선언과 값(참조 자료형은 객체)의 대입을 한 번에 작성해도 되고, 따로 구분해 작성해도 된다.
🥨배열 자료형 변수에 객체 대입
예 int[] a = new int [3];
int[] a;
a = new int[3];
예시 코드 중 배열 선언과 동시에 값을 대입한 첫 번째 코드를 좀 더 자세히 살펴보자. 각 구성 요소를 하나하나 뜯어 보면 먼저 int[]는 int 자료형만을 저장할 수 있는 배열을 의미한다. a는 참조 변수로 실제 데이터값을 저장하는 것이 아니라 실제 데이터 값의 위칫값을 저장한다. new 키워드는 힙 메모리에 객체를 넣으라는 의미이고, int[3]은 정수 3개를 저장할 수 있는 공간을 만들라는 의미이다. 이를 정리하면 int 자료형 3개를 저장할 수 있는 공간을 힙 메모리에 넣어두고 어디에 넣었는지를 참조 변수 a에 저장하라 는 의미인 것이다.
이 때의 메모리 구조는 다음과 같다.
여기서 알고 넘어가야 할 점은 스택 메모리 공간은 값을 초기화하지 않으면 빈 공간으로 존재한다는 것이다. 당연히 이때 해당 변수를 출력하면 오류가 발생한다. 반면 힙 메모리는 어떤 상황에서도 빈 공간이 존재하지 않는다. 그래서 값을 주지 않으면 컴파일러가 값을 강제로 초기화한다. 위 그림을 보면 배열의 공간이 0으로 초기화 된 것을 볼 수 있다. 강제 초기화 값은 자료형에 따라 다른데 기본 자료형일 때 숫자는 모두 0(실수는 0.0) 불리언은 false로 값이 초기화되며 이외의 모든 참조 자료형은 null로 초기화 된다. 강제 초기화는 나중에 다시 설명하기로 하고 여기서는 힙 메모리의 모든 값은 강제 초기화 된다는 사실만 기억하자.
+) 객체의 위치를 참조 변수에 저장하는 이유
new 키워드를 이용해 객체를 생성하면 자바 가상 머신은 힙 메모리 내에 비어 있는 공간에 객체를 생성한다. 힙 메모리에 비어 있는 공간은 그때그때 다를 것이므로 객체가 생성될 때마다 다른 위치에 저장될 수 있다. 따라서 자바 가상 머신이 생성한 객체의 위치를 반드시 알아야 개발자가 해당 객체를 사용할 수 있다. 비유하면 무인 사물함으로 물건을 전달받을 때 전달해주는 사람이 물건을 넣은 사물함의 번호를 알려줘야만 내가 그 물건을 바로 꺼낼 수 있는 상황을 떠올려 볼 수 있다.
// 배열의 선언 방법 1 - 자료형 뒤에 대괄호 표기
int[] array1 = new int[3];
int[] array2;
array2 = new int[3];
//배열의 선언 방법 2 - 변수명 뒤에 대괄호 표기
int array3[] = new int[3];
int array4[];
array4 = new int[3];
//다양한 배열 선언(기본 자료형 배열, 참조 자료형 배열)
boolean[] array5 = new boolean[3];
int[] array6 = new int[5];
double[] array7 = new double[7];
String[] array8 = new String[9];
4단계 객체에 값 입력하기
이제 생성한 객체에 값을 입력하는 방법을 알아보자. 배열은 값을 저장할 수 있는 공간마다 방 번호가 있는데, 이 번호를 인덱스 index라고 한다. 인덱스는 0부터 시작하며, 1씩 증가한다. 예를 들어 방이 3개일 때 방 번호, 즉 인덱스는 0, 1, 2이다. 인덱스를 이용해 각 저장 공간에 값을 대입하는 방법은 다음과 같다.
🥨배열 객체에 값 대입하기
참조 변수명[인덱스] = 값;
예
int[] a = new int[3];
a[0] = 3;
a[1] = 4;
a[2] = 5;
int [] a = new int [3]과 같이 처음 배열을 선언함과 동시에 객체를 생성하면 힙 메모리의 모든 값은 초기화된다. 이때 배열의 자료형이 정수이므로 초기화되는 값은 0이다.
값을 읽을 때도 다음과 같이 인덱스를 사용한다.
🥨배열 객체 값 읽어 오기
참조 변수명[인덱스];
예
System.out.println(a[0]); // 3
System.out.println(a[1]); // 4
System.out.println(a[2]); // 5
배열의 저장 공간에 값을 대입하거나 읽을 때 없는 인덱스를 사용하면 예외 exception이 발생하고 프로그램이 종료된다.
System.out.println(a[2]); // 5 출력
System.out.println(a[-1]); // 예외 발생
System.out.println(a[3]); // 예외 발생