배열
- 인덱스를 활용해 자료형이 같은 데이터를 관리하는 것
- 인덱스는 0부터 시작
배열의 사용
- 변수처럼 선언과 초기화 필요
자료형[] 배열이름 = new(객체생성) 자료형[배열크기]
의 모양
- 파이썬과 달리 처음 선언한 자료형의 데이터만 할당할 수 있음
int[]
로 선언하고 char
자료형 할당 불가능
new
: 객체생성을 위한 명령어
int[] arr1 = new int[5];
arr1[0] = 100;
arr1[1] = 200;
arr1[2] = 300;
arr1[3] = 400;
arr2[4] = 500;
int[] arr2 = {10, 20, 30, 40, 50};
- 파이썬은 리스트에
[]
사용, 자바의 경우 {}
- 자바의 경우 배열은 한번 크기가 정해지면 크기를 변경할 수 없음
- 파이썬의 list가 동적으로 크기를 변경하는 것과는 다름
배열의 메모리 크기
- 배열을 구성하는 데이터의 자료형에 따라 배열의 메모리 크기가 결정
int[] arr = new int[3];
- 이 경우
int 형
이 3개 존재함
- 따라서 4byte * 3 = 12 byte
배열을 가리키는 배열 이름
- 기본 자료형 데이터를 담고 있는 변수와 달리 배열 변수는 배열 데이터(객체)의 주소를 담고 있음
int[] i = new int[3];
- 이 경우
i[]
에 배열의 첫번째 인덱스의 주소를 갖고 있음
- 배열의 경우 메모리를 연속해서 사용하기 때문에 첫번째 인덱스의 주소 만으로 전체 주소를 알 수 있다.
배열 기본속성
int[] arrAtt1 = {10, 20, 30, 40, 50, 60};
int[] arrAtt2 = null;
int[] arrAtt3 = null;
System.out.println(arrAtt1.length);
System.out.println(Arrays.toString(arrAtt1));
- 배열 요소 복사
새로운배열이름 = Arrays.copyOf(복사하려는배열, 복사하려는배열크기)
- 새로운 배열 이름은 상단에 이미 생성해주었어야 함
arrAtt3 = Arrays.copyOf(arrAtt1, arrAtt1.length);
System.out.println(Arrays.toString(arrAtt3));
- 이 경우 복사한배열은 기존배열의 주소값을 갖고있는 것이 아님
- 동일한 배열을 메모리 공간 다른곳에 옮겨서 그곳의 주소를 갖고 있음
- 즉, 둘은 다른 객체임
- 배열 레퍼런스
새로운배열 = 기존배열
- 배열의 값이 아닌 주소값을 복사해옴
arrAtt2 = arrAtt1;
System.out.println(arrAtt1);
System.out.println(arrAtt2);
System.out.println(arrAtt3);
- 배열1과 배열2가 갖은 배열을 레퍼런스 하게됨
다차원 배열
- 배열의 요소가 배열
자료형[][] 배열이름 = new 자료형[행의크기][열의크기]
- 앞의 []가 바깥의 배열, 뒤의 []가 안의 배열
int[][] arrMul = new int[3][2];
arrMul[0][0] = 10;
arrMul[0][1] = 100;
arrMul[1][0] = 20;
arrMul[1][1] = 200;
arrMul[2][0] = 30;
arrMul[2][1] = 300;
int[][] arrMul = new int[][] {
{10, 100},
{20, 200},
{30, 300}
};
System.out.println(Arrays.toString(arrMul[0]));
System.out.println(Arrays.toString(arrMul[1]));
System.out.println(Arrays.toString(arrMul[2]));
System.out.println(arrMul[0][0]);
System.out.println(arrMul[0][1]);
System.out.println(arrMul[2][1]);
실수하기 쉬운 부분
- 복사와 레퍼런스 헷갈리지 말것!
- 레퍼런스는 새로운 객체를 만드는 것이 아님!!