array declaration

  • C++이랑 유사한데, 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
  • 당연히 reference 넣을 변수 선언 후 들어갈 reference를 집어넣는 것도 가능하다.
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이 아예 없으면 argsnull로 설정하는 대신 길이가 0인 배열로 설정, args를 참조하는 모든 녀석들이 exception을 안 일으키도록 돕는다.

  • 배열 길이를 구하는게 가능하다. C++과 좀 유사. 상수 취급으로 변동 불가능.

int[] array = new int[5];
System.out.println(array.length);
  • 아마 프로그래밍을 어느정도 했으면 알겠지만, 배열 길이 표기는 가급적이면 숫자로 말고 위의 방식을 사용하도록 하자 (코드 변동량이 많이 줄어들어 실수가 줄어든다.)

array initialization

  • 앞의 할당후 일일이 initialize하는 방식도 있지만 반복문을 사용하거나, C계열과 유사하게 다음과 같이 초기화도 가능.
int[] scores = new int[]{50, 60, 70, 80, 90};
  • 밑은 C계열과 비슷하면서 다르니 이 점 유의할것. error 부분이 좀 비직관적.
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 copy

  • 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

  • 그냥 String이 들어간 array다. 이걸 따로 다루는 이유는 기본형들 중 유일한 reference들로 이루어진 array기 때문이다.

  • reference의 경우 initialize될 때 default 값이 null이다.

char array

  • 사실 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)

multi-dimensional array

  • 선언이나 초기화 하는 방식이 위에서 1차원에 배운 방식과 C/C++계열에서 이미 썼던 방식을 조합한거랑 똑같다.
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
profile
안 흔하고 싶은 개발자. 관심 분야 : 임베디드/컴퓨터 시스템 및 아키텍처/웹/AI

0개의 댓글

Powered by GraphCDN, the GraphQL CDN