배열은 동일한 데이터 타입의 여러 값을 하나의 변수에 저장할 수 있는 자료 구조입니다. 자바에서는 배열을 사용하여 값의 집합을 간단하고 효율적으로 관리할 수 있습니다.
배열은 동일한 데이터 타입의 값을 여러 개 저장할 수 있는 자료구조입니다.
int[] numbers = {10, 20, 30, 40}; // 크기가 4인 정수 배열
데이터타입[] 배열이름;
또는
데이터타입 배열이름[];
데이터타입[] 배열이름 = new 데이터타입[배열의 크기];
int[] numbers = {10, 20, 30};
int[] numbers = new int[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
배열에 저장된 값을 배열의 요소라고 합니다. 변수는 값이 하나뿐이어서 변수명만으로 값에 접근할 수 있지만, 배열은 요소가 여러 개입니다. 변수명만으로는 원하는 요소에 접근할 수 없습니다. 그래서 배열에서는 요소의 위치를 나타내는 인덱스를 사용합니다.
배열의 요소는 인덱스를 사용하여 접근합니다.
ArrayIndexOutOfBoundsException이 발생합니다.public class Main {
public static void main(String[] args) {
int[] numbers = {10, 20, 30};
// 배열의 인덱스는 0부터 시작합니다.
System.out.println("첫 번째 요소: " + numbers[0]); // 10
System.out.println("두 번째 요소: " + numbers[1]); // 20
System.out.println("세 번째 요소: " + numbers[2]); // 30
}
}
배열에서 특정 값을 변경하기 위해서는 인덱스로 해당 위치에 접근한 후 새로운 값을 저장하면 됩니다.
배열명[인덱스] = 새로운 값;
배열은 반복문을 사용하여 손쉽게 모든 요소를 처리할 수 있습니다.
public class Main {
public static void main(String[] args) {
int[] numbers = {10, 20, 30};
// 배열의 인덱스는 0부터 시작한다는 점을 고려해서 반복문을 작성합니다.
for (int i = 0; i < numbers.length; i++) {
System.out.println("numbers[" + i + "] = " + numbers[i]);
}
}
}
numbers[0] = 10
numbers[1] = 20
numbers[2] = 30
public class Main {
public static void main(String[] args) {
int[] numbers = {10, 20, 30};
for (int number : numbers) {
System.out.println(number);
}
}
}
10
20
30
향상된 for 문은 배열의 모든 요소를 순회할 때 사용합니다.
for (자료형 변수명 : 배열명) {
실행문; // 배열의 각 요소에 대해 실행
}
일차원 배열이 여러 개 모이면 이차원 배열을 구성합니다.
이차원 배열은 배열 안에 배열이 존재하는 형태입니다. 이차원 배열은 행과 열로 구성됩니다. 엑셀에서의 표나 수학에서 배운 행렬을 생각하면 됩니다.
이차원 배열을 선언할 때는 대괄호 2개([][])를 사용합니다. 이차원 배열을 선언하고 초기화하는 방법은 다음과 같습니다.
데이터타입[][] 배열이름;
또는
데이터타입[][] 배열명 = new 데이터타입[행 크기][열 크기];
이차원 배열을 선언하고 일차원 배열을 값으로 넣어 초기화합니다.
int[][] array = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}
또는
public class Main {
public static void main(String[] args) {
int[][] array = new int[3][3]; // 3행 3열 배열
array[0][0] = 1;
array[0][1] = 2;
array[0][2] = 3;
array[1][0] = 4;
array[1][1] = 5;
array[1][2] = 6;
array[2][0] = 7;
array[2][1] = 8;
array[2][2] = 9;
}
}
이차원 배열의 요소는 행과 열의 인덱스를 사용하여 접근합니다.
public class Main {
public static void main(String[] args) {
int[][] array = {
{1, 2, 3},
{4, 5, 6}
};
System.out.println("array[0][1] = " + array[0][1]); // 2
}
public class Main {
public static void main(String[] args) {
int[][] array = {
{1, 2, 3},
{4, 5, 6}
};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " "); // 값 구분을 위해 공백 추가
}
}
}
}
1 2 3 4 5 6
public class Gugudan {
public static void main(String[] args) {
int[][] gugudan = new int[9][9];
// 배열 초기화
for (int i = 0; i < gugudan.length; i++) {
for (int j = 0; j < gugudan[i].length; j++) {
gugudan[i][j] = (i + 1) * (j + 1);
}
}
// 배열 출력
for (int i = 0; i < gugudan.length; i++) {
for (int j = 0; j < gugudan[i].length; j++) {
System.out.print((i + 1) + "x" + (j + 1) + "=" + gugudan[i][j] + "\t");
}
System.out.println();
}
}
}
1x1=1 1x2=2 1x3=3 ... 1x9=9
2x1=2 2x2=4 2x3=6 ... 2x9=18
...
9x1=9 9x2=18 9x3=27 ... 9x9=81
배열은 자바에서 참조 자료형으로, 실제 데이터는 힙(Heap) 메모리에 저장되고, 배열 변수를 통해 그 데이터에 접근합니다. 배열을 복사할 때, 메모리 참조 방식에 따라 얕은 복사(shallow copy)와 깊은 복사(deep copy)로 나뉩니다.
특징
배열과 관련
특징
배열과 관련
메모리 구조 예제
public class MemoryExample {
public static void main(String[] args) {
int[] origin = {1, 2, 3}; // origin은 스택에 저장, 배열 데이터는 힙에 저장
int[] copy = origin; // copy도 스택에 저장, origin과 같은 힙 주소 참조
copy[0] = 99; // 힙 영역의 데이터가 변경됨
System.out.println("origin[0]: " + origin[0]); // 99
}
}
메모리 동작
origin 배열 선언:origin 변수는 스택에 저장됩니다.{1, 2, 3} 배열 데이터는 힙에 저장됩니다.origin 변수는 힙 영역의 메모리 주소를 참조합니다.copy 배열 선언:copy 변수는 스택에 저장됩니다.copy는 origin과 같은 힙 메모리 주소를 참조합니다.copy[0] = 99 수행:origin과 copy 모두 동일한 힙 데이터를 참조하므로 origin[0]도 변경됩니다.얕은 복사는 메모리 주소만 복사하므로 원본과 복사본이 동일한 데이터를 참조합니다.
예제
public class ShallowCopyExample {
public static void main(String[] args) {
int[] origin = {1, 2, 3};
int[] copy = origin; // 메모리 주소 복사 (얕은 복사)
copy[1] = 88; // 복사본 수정
// 원본 배열도 영향을 미침
System.out.println("origin[1]: " + origin[1]); // 88
}
}
출력
origin[1]: 88
깊은 복사는 새로운 배열을 생성하고 데이터를 복사하여, 원본과 복사본이 독립적으로 작동합니다.
깊은 복사 방법
int[] copy = new int[origin.length];
for (int i = 0; i < origin.length; i++) {
copy[i] = origin[i];
}
System.arraycopy 메서드 System.arraycopy(origin, 0, copy, 0, origin.length);
Arrays.copyOf 메서드 int[] copy = java.util.Arrays.copyOf(origin, origin.length);
예제: 깊은 복사
public class DeepCopyExample {
public static void main(String[] args) {
int[] origin = {1, 2, 3};
int[] copy = new int[origin.length];
// 깊은 복사 수행
for (int i = 0; i < origin.length; i++) {
copy[i] = origin[i];
}
// 복사본 수정
copy[0] = 99;
// 원본 배열은 영향을 받지 않음
System.out.println("origin[0]: " + origin[0]); // 1
System.out.println("copy[0]: " + copy[0]); // 99
}
}
출력
origin[0]: 1
copy[0]: 99