배열이란?
배열을 배우기에 앞서 C언어에서의 배열 사용법을 살펴보며 배열의 기본적인 개념을 익혔다. ==> C언어의 포인터 변수와 배열. 배열을 사용하면 같은 종류의 메모리를 쉽게 만들 수 있다. 배열 레퍼런스를 선언하는 방법은 다음과 같다.
1
2
3
4
5
6
int[] arr = new int[5];
// 메모리종류[] 메모리이름 = new 메모리종류[개수]
// 데이터타입[] 변수명 = new 데이터타입[개수]
//c언어 스타일
int arr[] = new int[5]; //단 개수를 지정해서는 안 된다.
인스턴스와 레퍼런스
int[ ] p = new int [3]
은 int 단위 3개, 즉 12바이트의 연속적인 메모리를 확보하라는 명령어이다. 여기서 new 명령으로 확보한 메모리를 인스턴스(instance)라고 한다. p 변수에는 인스턴스(메모리)의 주소가 저장되고, 이 변수를 레퍼런스(reference)라고 한다. 자바에서는 primitive variables 를 제외한 모든 변수는 레퍼런스이다. 위의 그림은 다음의 코드를 시각화한 것이다.
1
2
3
4
5
6
int[] p = new int[3]; //주소가 1200(가정)인 메모리 참조
int[] p2 = new int[3]; //주소가 3400(가정)인 메모리 참조
int[] p3; //주소가 비어있는 변수
p2 = p; //주소가 1200인 메모리 참조 => 3400인 메모리는 참조하는 변수가 없다.
p2 = null; //주소값을 0으로 초기화
위의 코드에서 p1은 주소가 1200인 메모리를 참조하고 있고, p2와 p3는 주소값이 비어있으며, 주소가 3400인 메모리는 아무도 참조하지 않고 자리만 차지하고 있는 메모리, 즉 가비지가 되었다.
가비지(garbage)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int* x1;
x1 = (int*) malloc(12);
x1 = (int*) malloc(120); // 예) 200번지, 100번지는 가비지가 된다.
// 100번지는 주소를 잃어 버려 사용할 수 없다.
// 존재를 하지만 주소를 이용하여 쓸 수 없음. 메모리만 차지.
// dangling object(c언어) = garbage(자바)
free(x1); //메모리 해제. 200번지 주소는 무효하다.
x1[0] = 34; //x1은 무효한 주소를 갖고 있다.
// 무효한 주소를 dangling pointer 라 부른다.
// x1은 해제된 메모리를 가리킴. 쓰지 않겠다고 선언한 무효한 주소를 dangling pointer. 자바의 경우 이것이 존재할 수 없음. 메모리를 강제로 해제시키는 명령어가 없기 때문. c++의 경우에는 delete이라는 명령어로 해제.
가비지 컬렉터
System.gc();
당장 가비지 컬렉터를 실행하라는 뜻이 아니라 가능하다면 빠른 시일 내에 가비지를 수집해 줄 것을 요구하는 명령어이다.gc()
를 호출한다고 해서 바로 가비지 컬렉터가 동작하는 것은 아니다. 그 요구를 수용할 지 여부는 JVM의 판단에 달려 있다.
배열에 값 저장
1
2
3
4
5
p[0] = 100;
p[1] = 200;
p[2] = 300;
System.out.printf("%d, %d, %d", p[0], p[1], p[2]);
배열 범위를 넘어가는 값을 저장할 경우
1
p[3] = 400;
인덱스의 범위를 넘어가면 실행 예외(runtime exception)가 발생한다. 사용할 수 없는 메모리에 값을 넣어도 그냥 실행하는 c언어와의 차이점이다. `
배열의 개수 알아내기
arrayName.length
사용
1
System.out.println(p.length);
단, 다음과 같이 배열의 주소가 없는 상태에서 사용하지 말아야 한다. c언어의 경우 컴파일 가능하지만 java의 경우 컴파일 오류가 발생한다.
1
2
int[] x;
System.out.println(x.length);
배열과 반복문
1
2
3
4
5
int sum = 0;
for (int i = 0; i < p.length; i++) {
sum = sum + p[i];
}
System.out.println(sum);
배열의 인덱스를 활용하여 반복적인 처리를 반복문으로 쉽게 코딩할 수 있다.
레퍼런스 변수의 주소 값을 0으로 초기화하기
1
2
3
// 레퍼런스 변수의 주소 값을 0으로 초기화하기
//p2 = 0; // 컴파일 오류! 이렇게 직접적으로 초기화시킬 수 없다.
p2 = null; // 주소 변수(레퍼런스)를 0으로 초기화시키려면 null을 사용하라.
자바호환 언어인 코틀린은 자바의 null point exception 문제를 해결하기 위해 만든 언어이다. 구글이 오라클과의 법적 분쟁 이후 안드로이드 코드를 코틀린으로 변경하고 있기 때문에 안드로이드는 자바보다는 코틀린으로 배우는 것이 좋다.