배열은 동일한 데이터 타입의 값들을 하나의 묶음으로 관리하는 자료구조입니다.
자바에서는 두 가지 선언 방식이 있지만, 첫 번째 방식을 권장합니다.
// 1. 선언 (권장)
String[] names;
// 2. 생성과 동시에 초기화
String[] st1 = new String[5]; // 기본값(null)으로 초기화된 크기 5의 배열
String[] st2 = {"Apple", "Banana", "Cherry"}; // 선언과 동시에 직접 할당
💡 꿀팁: 배열을 먼저 선언하고 나중에 값을 할당할 때는
st1 = new String[] {"A", "B"};처럼new키워드를 반드시 붙여줘야 합니다.
배열을 제대로 이해하려면 메모리 영역을 알아야 합니다.
new 연산자로 생성된 실제 데이터 객체가 저장되는 공간입니다.int[] 같은 기본형 배열은 힙에 실제 숫자가 저장되지만, String[] 배열은 힙 영역에 문자열 객체들의 주소값을 담습니다. 즉, 2단계의 참조 구조를 가집니다.
배열의 모든 요소를 확인할 때 사용하는 방법들입니다.
for (int i = 0; i < arr.length; i++) {
arr[i] = i * 10; // 인덱스를 이용해 값 수정 가능
}
for (int x : arr) {
System.out.println(x); // 가독성이 좋지만, 값을 직접 수정할 수는 없음
}
반복문 없이 한 줄로 배열 내용을 출력하고 싶을 때 유용합니다.
System.out.println(Arrays.toString(arr)); // 출력: [1, 2, 3]
| 구분 | 설명 | 특징 |
|---|---|---|
| 얕은 복사 (Shallow) | 주소값만 복사 | 복사본을 수정하면 원본도 함께 변함 |
| 깊은 복사 (Deep) | 새로운 메모리 공간에 값 복제 | 원본과 복사본이 독립적임 |
Arrays.copyOf(원본, 길이) 또는 System.arraycopy() 사용2차원 배열은 '배열을 요소로 가지는 배열'입니다.
int[][] arr = new int[2][3]; // 2행 3열의 행렬 구조
Q: 2차원 배열에서 for-each문으로 값을 수정하면 반영될까?
for(int[] a : arr4) {
a[0] = 100; // 결과: 원본 배열의 값이 바뀐다!
}
A: 예, 바뀝니다. int[] a는 행 자체를 가리키는 참조 변수이기 때문에, a[0]을 수정하는 것은 실제 힙 영역에 있는 메모리 주소를 찾아가 값을 바꾸는 것과 같습니다. (1차원 배열의 int x가 값을 직접 복사해오는 것과는 다릅니다.)
Scanner에는 nextChar()가 없기 때문에 아래와 같이 사용합니다.
char c = sc.next().charAt(0);
String은 객체라 메모리를 많이 먹지만, char는 2바이트 기본형이라 대용량 데이터를 다룰 때 훨씬 빠르고 효율적입니다.