new
를 무조건 사용해야 한다는 차이점이 있다. (memory management를 본인이 직접 안하기 때문에 그렇다.)int[] scores; //similar to pointer generation in c++. actually declaring reference container
int scores2[]; //also similar to pointer generation in c++. actually declaring reference container
scores = new int[5]; //length 5 integer array. putting reference inside a container
int[] scores3 = new int[5]; //declaration in one line.
new
로 배열 생성시 배열이 내용물들이 다 0으로 초기화된 되는데, 이는 C++과 동일한 문법이다.
indexing은 0부터 시작한다. C/C++과 동일. 변수 사용 참조도 가능
scores[0] = 1;
scores[1] = 2;
int i = 3;
scores[i] = 3;
C/C++은 index 범위를 넘을시 무슨 일이 일어날지 모르나, Java는 그냥 바로 Exception을 일으킨다. (ArrayIndexOutofBoundsException)
배열 선언시 길이는 int
의 양수부분 및 0이 들어가는게 가능하다. 배열 길이가 0이 될 수 있다는게 특이한데 이것의 활용처는 main 함수에서 parameter을 args
를 통해 받을 때 parameter이 아예 없으면 args
를 null
로 설정하는 대신 길이가 0인 배열로 설정, args
를 참조하는 모든 녀석들이 exception을 안 일으키도록 돕는다.
배열 길이를 구하는게 가능하다. C++과 좀 유사. 상수 취급으로 변동 불가능.
int[] array = new int[5];
System.out.println(array.length);
int[] scores = new int[]{50, 60, 70, 80, 90};
int[] array; //reference holder
array = new int[]{1, 2, 3, 4, 5}; //ok.
int[] array2 = {1, 2, 3, 4, 5}; //ok.
int[] array3; //reference holder
array3 = {1, 2, 3, 4, 5}; //error
int add(int[] arr) {...} //some method/function
int r = add(new int[]{1, 2, 3, 4, 5}); //ok.
int r2 = add({1, 2, 3, 4, 5}); //error
보통 배열 자체를 출력하면 reference가 출력된다.
하지만 char
배열의 경우 char
내의 element들이 구분자 없이 출력된다.
char[] chArray = {'h', 'i'};
System.out.println(chArray); //prints "hi"
array의 size는 변동 불가. 이 때문에 size 확장 필요시 복사를 해야 한다. 시스템 계열 공부를 조금 했다면 이는 매우 오래 걸리는 operation인걸 알테니 가급적 처음 할당 때 많이 해놓도록. (할당을 자주하는것도 별로고, 옮기는 과정도 시간이 오래걸린다.)
가장 단순한 방법은 반복문 활용
또 C++의 std::copy
랑 유사한 System.arraycopy
를 활용해도 된다.
int[] num = {1, 2, 3, 4, 5};
int[] newNum = new int[10];
System.arraycopy(num, 0, newNum, 0, num.length);
그냥 String
이 들어간 array다. 이걸 따로 다루는 이유는 기본형들 중 유일한 reference들로 이루어진 array기 때문이다.
reference의 경우 initialize될 때 default 값이 null
이다.
사실 String
class는 char
array를 class로 포장한 형태다. 그러니까 char
array에 method랑 attribute랑 이것저것 넣은것이라고 생각하면 된다. (객체지향도 기본적인건 다 알고 있다고 가정한 설명)
이때 유의해야하는게 String
class의 객체 안의 내용물 변동은 안되지만 char
array의 경우 보통 변동이 가능하다.
toCharArray
method를 String
객체에 대해서 사용하면 변동 가능한 char
array를 얻을 수는 있으나, 그걸 변동한다고 array를 추출한 String
의 내용물이 변동되는건 당연히 아니라는 점 참고.
반대로 char
array를 String
객체로 변환하는 것도 가능하다.
char[] array = {'h', 'i'}; //char array
String str = new String(array); //String instance
char[] array2 = str.toCharArray(); //char array, content is same as array. (reference not same)
int[][] array = new int[][];
int[][] array2 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
reference 안에 reference 안에 내용물이 있는것이 어떻게 이루어져있는지는 C/C++계열에서 주구창창 해왔을테니 다 알고 있다고 가정하겠다.
참조도 똑같이 하면 된다.
System.out.println(array2[1][2]); //6