동일한 타입의 데이터 2개 이상을 하나의 연속된 메모리 공간에서 관리하는 것을 배열이라고 합니다.
배열의 선언 : 생성하고 싶은 변수의 타입과 [ ]기호를 통해 배열을 선언할 수 있습니다.
<타입>[ ] <변수명>; or <타입> <변수명>[ ];int[ ] num_lst; String names[ ];배열의 생성 및 초기화 : new키워드를 사용해서 선언된 배열을 생성/초기화합니다.
new <타입>[<크기>];num_lst = new int[5]; // int타입 자료형을 5개 저장할 수 있는 배열 생성| 자료형 | 기본값 |
|---|---|
| boolean | false |
| char | '\u0000' |
| byte,short,int | 0 |
| long | 0L |
| float | 0.0f |
| double | 0.0 |
| 참조형 변수 | null |
배열의 생성과 동시에 할당한 값으로 초기화하기 : 생성과 동시에 값을 전달해주면 기본값이 아닌 원하는 값으로 할당하며 초기화할 수 있습니다. 단, 초기화는 생성할 때만 가능합니다. 이후에는 각 값을 따로 변경해줘야합니다.
int[] a = new int[] {1,2,3,4,5};int[] b = {1,3,5,7,9};int[] c; c = {2,4,6,8} // 컴파일 에러 배열의 특징
Arrays.toString(<배열>)으로 확인 가능합니다. //EX)
int[] num_lst = {1,2,3,4,5};
for(int n : num_lst) {
System.out.println(n);
}
배열의 수정 / 복사
배열은 최초 메모리 할당 이후, 변경할 수 없다는 불변 객체(Immutable Object) 입니다.
개별 요소는 다른 값으로 변경이 가능하나, 요소를 추가하거나 삭제, 배열의 크기 변경은 불가능합니다.
배열을 복사할 때는 복사 method를 사용해서 복사할 수 있습니다.
기본적으로 = 대입 연산자를 통해서 복사를 한다면 얕은 복사(Shallow Copy)가 일어나게 됩니다. 얕은 복사는 배열을 복사해서 새로 생성하는 것이 아닌, 원래 있는 배열의 주소값을 같이 갖게 되므로 원본 배열이 변경되면 얕은 복사를 한 배열도 같이 변경됩니다.
깊은 복사(Deep Copy)를 해주면 이러한 문제를 해결할 수 있습니다. 배열을 복사해서 한 개 더 만들 때 사용하는 깊은 복사 method 2가지가 제공됩니다.
System.arrayCopy(Object src, int srcPos, Object dst, int dstPos, int length);
Arrays.copyOf(Object src, int length);
2차원 배열의 선언 : 생성하고 싶은 변수의 타입과 [ ][ ]기호를 통해 배열을 선언할 수 있습니다.
<타입>[ ][ ] <변수명>; or <타입>[ ] <변수명>[ ]; or <타입> <변수명>[ ][ ]int[ ][ ] num_lst; String[ ] names[ ]; boolean visited[ ][ ];2차원 배열의 생성 및 초기화 : new키워드를 사용해서 선언된 배열을 생성/초기화합니다.
new <타입>[<크기>][<크기>];num_lst = new int[5][3]; // int타입 자료형을 3개 저장할 수 있는 배열을 담을 수 있는 배열을 5개 생성배열의 생성과 동시에 할당한 값으로 초기화하기 : 다차원 배열도 { }와, 기호로 값을 할당하며 초기화 할 수 있습니다.
int[][] a = new int[] {{1,2},{3,4},{5,6}};다차원 배열은 꼭 같은 차원의 배열이 같은 크기일 필요는 없습니다. 2차원 이상의 배열에서는 하위 차원의 배열의 주소값만 갖게 되므로 크기가 모두 같지 않아도 됩니다.
int[][] num_lst = new int[2];num_lst[0] = new int[3];num_lst[1] = new int[2];// EX) 5*5 배열 순회하기
int N = 5;
int[][] board = new int[N][N];
/*배열 값 할당 완료되었다고 가정*/
for(int r = 0; r < N; r++) {
for(int c = 0; c < N; c++) {
System.out.print(board[r][c]);
System.out.print(" ");
}
System.out.println();
}
// 위의 코드와 똑같이 동작함
for(int[] row : board) {
for(int col: row) {
System.out.print(col);
System.out.print(" ");
}
System.out.println();
}
// EX) 5*5 배열에서 각 칸의 4방향의 합 출력하기
int[][] deltas = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int N = 5;
int[][] board = new int[N][N];
/*배열 값 할당 완료되었다고 가정*/
for(int r = 0; r < N; r++) {
for(int c = 0; c < N; c++) {
int sum = 0;
for(int d = 0; d < 4; d++) {
int nr = r + deltas[d][0];
int nc = c + deltas[d][1];
if(0 <= nr && nr < N && 0 <= nc && nc < N){
sum += board[nr][nc];
}
}
System.out.print(sum);
System.out.print(" ");
}
System.out.println();
}