하나의 값만 저장하는 공간인 변수는 하나만 저장이 가능하기에 배열이 만들어짐
배열이란?
같은 자료형의 데이터의 여러개의 값을 저장할 수 있는 공간
배열 선언
자료형[] 배열명; // 자바식. 대부분 이쪽 사용
자료형 배열명[]; // C언어식.
int[] arr;
배열은 선언만해서는 쓸 수 없고 할당까지 해야함
배열은 기본자료형이 아니며 참조자료형처럼 사용
구조가 참조자료형처럼 되어있어 주소값을 갖는다
기본형, 참조형 구분 기준 : call by value & call by reference
즉, 주소값을 가져오느냐 값 자체를 그대로 복사해서 가져오느냐
* Stack 영역에 공간 생성
배열 할당
heap 메모리 영역에 공간을 생성하는 것
(변수의 선언 : stack에 공간 차지)
자료형[] 배열명 = new 배열명[배열길이]
자료형 배열명[] = new 자료형[배열길이]
메모리 영역에 공간을 생성해주는 역할을 new 연산자가 실행
new 연산자가 배열 할당하는 역할+heap영역에 생성된 공간에 대한 주소값을 발생시킴
배열의 크기 변경 가능할까?
배열은 크기 변경 불가
새로운 배열을 만들고 바꿔치기하거라 주소값이 바뀐다(0x100→0x200)
System.out.print("새로 할당할 배열의 길이 입력 : ");
int size = sc.nextInt();
double[] dArr = new double[size];
System.out.println("dArr의 길이 : "+dArr.length);
System.out.println("dArr의 주소값 : "+ dArr); // [D@74a14482
dArr = new double[5];
System.out.println("변경 후 dArr의 길이 : " + dArr.length);// 배열 길이 변경 가능
System.out.println("변경 후 dArr의 주소값 : " + dArr); // but 길이 변경 후 주소값 달라짐 [D@1540e19d
System.out.println(); //
// 주소값하면 new 연산자가 떠올라야.
// dArr[30]에서 new연산자가 쓰이면서 새로운 공간생성과 함께 주소값 생성하기에 주소값이 달라짐
그래서 주소값이 바뀌는 것(0x100→0x200)
기존 배열 유지x
new연산자에 의해 heap영역에 새로운 배열의 공간이 생성되고 그에 따라 stack에 있는 변수명 dArr의 참조 변수값(주소값)도 0x100→0x200 바뀜
new 연산자 역할
1)배열 할당 : heap 메모리 영역에 공간 생성
2)heap 영역에 생성된 공간에 대한 주소값 생성
-배열 한칸이 아닌 배열 한덩이 전체에 대한 주소값
ex)주소값 0x100
heap이 컴퓨터와 사용자가 같이 사용하는 공간인 것
배열명에 담긴게 heap메모리 영역에 생성된 주소값을 담은 것
주소를 통해서 실제 데이터를 가리키는 것이다.
배열 초기화
1)인덱스 이용
- 중괄호{}를 이용
- for문 이용
1)인덱스 이용
배열명[인덱스] 값;
ex)
int[] iArr = new int[3];
iArr[0] = 1;
iArr[1] = 2;
iArr[2] = 3;
iArr[3] = 4; // error : 배열이 3칸 할당됬는데 없는 4칸째에 값을 할당하려해서
2) 중괄호{} 이용
자료형[] 배열명 = {값,값};
ex)
int[] arr = {1,2,3,4}; // 값 수에 따라 알아서 배열 칸 지정하고 생성함
3) for문 이용
내가 초기화할 값에 ‘규칙’이 존재할 경우 사용가능
for문 인덱스 이용한거라 int만 가능
for(int i=0; i<str.length; i++) {
arr[i] = i + 1;
}
배열 삭제
null 상태로 만드는게 삭제
**dArr = null;**
null을 넣으면 0x100→0x200 바뀐주소가 null로 바뀌면서 0x200과 연결이 끊어지면서 0x200의 데이터는사리지고 사실상 삭제 효과가 나타난다
'JAVA > 개념정리' 카테고리의 다른 글
[Java] 배열(Array) : 얕은 복사(shallow copy) & 깊은 복사(deep copy) (0) | 2022.08.01 |
---|---|
[Java] 배열(array) 값 출력하는 방법 2가지 : for문, Arrays.toString() (0) | 2022.07.31 |
[Java] 제어문(control flow statement) : 분기문 - break, continue (0) | 2022.07.30 |
[Java] 제어문(control flow statement) : 반복문 - for, while, do while (0) | 2022.07.30 |
[Java] 제어문(control flow statement) : 조건문 - if, switch (0) | 2022.07.29 |