프로그래밍을 공부하면서 자바와 자바스크립트의 차이를 느낄 때가 많다. 최근에는 자바의 2차원 배열을 공부하면서 자바스크립트와 비교했을 때 "왜 이렇게 복잡하지?"라는 생각이 들었다. 이번 글에서는 내가 헷갈렸던 부분을 정리해보고, 자바와 자바스크립트에서 2차원 배열을 어떻게 다루는지 비교해보겠다.
2차원 배열은 배열 안에 또 다른 배열이 있는 구조다. 흔히 행(row)과 열(column)으로 구성된 표 형태라고 생각하면 이해하기 쉽다.
자바에서 2차원 배열을 선언하고 초기화하는 방법은 다음과 같다.
public class ArrayExample {
public static void main(String[] args) {
boolean[][] board = {
{true, false},
{false, true}
};
System.out.println(board.length); // 2 (행 개수)
System.out.println(board[0].length); // 2 (첫 번째 행의 열 개수)
}
}
여기서 중요한 것은 board.length
와 board[i].length
의 차이다.
board.length
→ 2차원 배열의 행 개수board[i].length
→ 해당 행에 있는 열 개수❗ 헷갈렸던 부분: 처음에는
board[0]
을 출력했을 때 배열이 아니라[Z@41629346
같은 이상한 값이 나와서 당황했다. 이는board[0]
이 배열(객체)이기 때문에 참조값이 출력된 것이었다. 따라서 배열의 내용을 보려면Arrays.toString()
또는Arrays.deepToString()
을 사용해야 한다.
import java.util.Arrays;
System.out.println(Arrays.toString(board[0])); // [true, false]
System.out.println(Arrays.deepToString(board)); // [[true, false], [false, true]]
자바스크립트에서는 2차원 배열을 더 간단하게 만들 수 있다.
let board = [
[true, false],
[false, true]
];
console.log(board.length); // 2 (행 개수)
console.log(board[0].length); // 2 (첫 번째 행의 열 개수)
자바스크립트의 배열은 길이가 고정되지 않기 때문에, 행마다 열 개수가 달라도 문제없다.
let board = [
[true, false, true], // 3개
[false, true] // 2개
];
console.log(board[0].length); // 3
console.log(board[1].length); // 2
반면, 자바에서는 배열의 크기가 고정되어 있어서 이렇게 하면 ArrayIndexOutOfBoundsException
이 발생할 수도 있다.
자바에서는 행(board.length
)을 반복하는 바깥 루프와, 각 행의 열(board[i].length
)을 반복하는 안쪽 루프를 사용한다.
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
j < board[i].length
가 중요한 이유처음에는 j < board.length
라고 쓸 뻔했다. 하지만 각 행마다 열 개수가 다를 수도 있기 때문에, 정확한 board[i].length
를 기준으로 반복해야 한다.
자바스크립트에서는 for...of
문을 사용하면 더 직관적으로 2차원 배열을 탐색할 수 있다.
for (let row of board) { // 행 반복
for (let cell of row) { // 열 반복
console.log(cell);
}
}
자바에서도 for-each
문(for (boolean[] row : board)
)을 쓰면 비슷한 효과를 낼 수 있지만, 기본적으로는 인덱스를 활용한 for
문을 더 많이 사용한다.
자바(Java) | 자바스크립트(JavaScript) | |
---|---|---|
배열 크기 | 고정 (생성 시 크기 변경 불가) | 유동적 (길이 변경 가능) |
2차원 배열 선언 | boolean[][] board = new boolean[2][2]; | let board = [[true, false], [false, true]]; |
배열 요소 출력 | System.out.println(Arrays.deepToString(board)); | console.log(board); |
반복문 | for (int i = 0; i < board.length; i++) | for (let row of board) {} |
유연성 | 행마다 열 개수가 다르면 오류 발생 가능 | 자유롭게 가변 길이 가능 |
자바와 자바스크립트의 2차원 배열을 비교해보니, 자바스크립트가 더 유연하고 직관적으로 다룰 수 있다는 것을 알게 되었다. 특히 for...of
문을 활용하면 코드가 더 깔끔해지는 점이 인상적이었다. 반면, 자바는 배열의 크기가 고정되어 있어서 배열을 선언할 때 크기를 미리 정해야 한다는 점이 달랐다.
처음에는 자바에서 board.length
와 board[i].length
의 차이를 이해하는 것이 어려웠지만, 자바는 행과 열 크기가 엄격하게 관리되는 구조라는 점을 기억하면 이해하기 쉬웠다.
이제는 자바에서도 2차원 배열을 조금 더 자연스럽게 사용할 수 있을 것 같다! 😊
완