Day 6: 배열
배열은 같은 자료형의 데이터를 연속된 메모리 공간에 저장하는 자료구조입니다. 크기가 고정되어 있으며, 인덱스를 통해 빠르게 접근할 수 있습니다. 인덱스는 0부터 시작합니다.
배열 선언과 초기화
배열을 만드는 여러 가지 방법을 알아봅니다.
public class ArrayBasic {
public static void main(String[] args) {
// 방법 1: 크기만 지정 (기본값으로 초기화)
int[] numbers = new int[5]; // [0, 0, 0, 0, 0]
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
// 방법 2: 선언과 동시에 초기화
int[] scores = {95, 80, 70, 100, 88};
// 방법 3: new 키워드와 함께 초기화
String[] fruits = new String[]{"사과", "바나나", "포도"};
// 배열 길이
System.out.println("배열 길이: " + scores.length); // 5
// 인덱스로 접근
System.out.println("첫 번째 점수: " + scores[0]); // 95
System.out.println("마지막 점수: " + scores[scores.length - 1]); // 88
// 배열 요소 출력
for (int i = 0; i < fruits.length; i++) {
System.out.println("과일 " + (i + 1) + ": " + fruits[i]);
}
}
}
향상된 for 문 (for-each)
배열의 모든 요소를 순회할 때 간결하게 사용할 수 있습니다.
import java.util.Arrays;
public class EnhancedForLoop {
public static void main(String[] args) {
int[] numbers = {15, 23, 8, 42, 37, 11, 29};
// 향상된 for문으로 전체 출력
for (int num : numbers) {
System.out.print(num + " ");
}
System.out.println();
// 합계와 평균 구하기
int sum = 0;
for (int num : numbers) {
sum += num;
}
double average = (double) sum / numbers.length;
System.out.println("합계: " + sum);
System.out.println("평균: " + average);
// 최대값, 최소값 찾기
int max = numbers[0];
int min = numbers[0];
for (int num : numbers) {
if (num > max) max = num;
if (num < min) min = num;
}
System.out.println("최대값: " + max);
System.out.println("최소값: " + min);
// Arrays 유틸리티 클래스
Arrays.sort(numbers); // 정렬
System.out.println("정렬: " + Arrays.toString(numbers));
}
}
다차원 배열
행과 열로 이루어진 2차원 배열을 다뤄봅니다.
public class MultiDimensionalArray {
public static void main(String[] args) {
// 2차원 배열 선언
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 2차원 배열 출력
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.printf("%3d", matrix[i][j]);
}
System.out.println();
}
// 향상된 for문으로 2차원 배열 순회
int total = 0;
for (int[] row : matrix) {
for (int val : row) {
total += val;
}
}
System.out.println("전체 합계: " + total);
// 가변 길이 배열 (jagged array)
int[][] jagged = new int[3][];
jagged[0] = new int[]{1, 2};
jagged[1] = new int[]{3, 4, 5};
jagged[2] = new int[]{6};
for (int[] row : jagged) {
System.out.println(java.util.Arrays.toString(row));
}
}
}
배열 복사와 비교
배열을 복사할 때 주의할 점을 알아봅니다.
import java.util.Arrays;
public class ArrayCopy {
public static void main(String[] args) {
int[] original = {1, 2, 3, 4, 5};
// 얕은 복사: 참조만 복사 (같은 배열을 가리킴)
int[] shallow = original;
shallow[0] = 999;
System.out.println("원본[0]: " + original[0]); // 999 (변경됨!)
// 깊은 복사 방법들
int[] copy1 = Arrays.copyOf(original, original.length);
int[] copy2 = original.clone();
int[] copy3 = new int[original.length];
System.arraycopy(original, 0, copy3, 0, original.length);
copy1[0] = 111;
System.out.println("원본[0]: " + original[0]); // 999 (영향 없음)
System.out.println("복사본[0]: " + copy1[0]); // 111
// 배열 비교
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a == b); // false (참조 비교)
System.out.println(Arrays.equals(a, b)); // true (내용 비교)
}
}
오늘의 연습문제
-
점수 통계: 학생 10명의 점수를 배열에 저장하고, 최고점, 최저점, 평균, 평균 이상인 학생 수를 출력하는 프로그램을 작성하세요.
-
배열 뒤집기: 정수 배열
{1, 2, 3, 4, 5, 6, 7}을 새 배열 없이 원본 배열 안에서 뒤집는(reverse) 프로그램을 작성하세요. (swap 활용) -
행렬 덧셈: 3x3 크기의 두 2차원 배열을 선언하고, 두 행렬의 같은 위치 요소를 더한 결과 행렬을 출력하는 프로그램을 작성하세요.