배열이란?
배열은 동일한 타입의 여러 값을 하나의 변수에 묶어서 저장하는 자료구조입니다. 각 값을 별도로 저장하는 대신, 하나의 변수로 여러 값을 관리할 수 있습니다.
배열의 특징
- 크기 조정 불가
배열은 선언된 순간부터 크기를 변경할 수 없습니다. 크기를 변경하고 싶다면 새로운 배열을 생성한 후, 기존 배열의 요소를 새 배열에 복사해야 합니다. - 요소에 빠른 접근
배열은 인덱스를 통해 각 요소에 빠르게 접근할 수 있습니다. 요소 접근의 시간 복잡도는 O(1)로 매우 빠릅니다. 배열은 반복문을 사용하여 요소에 쉽게 접근할 수 있는 자료구조입니다. - 인덱스는 0부터 시작
배열의 인덱스는 0부터 시작합니다. 즉, 배열의 첫 번째 요소는 인덱스 0에 위치하며, 마지막 요소는 배열 크기에서 1을 뺀 인덱스에 위치합니다. - 배열의 마지막 인덱스는 n-1
배열의 마지막 요소는 배열의 크기 - 1 인덱스에 위치합니다. 예를 들어, 배열의 크기가 5라면 마지막 인덱스는 4입니다.
배열 선언
배열은 대괄호 []를 사용하여 선언합니다. 배열을 초기화할 때는 배열의 크기를 지정해야 하며, 크기를 지정하지 않으면 오류가 발생합니다.
public class Main {
public static void main(String[] args) {
int[] arr1 = new int[3]; // 크기가 3인 정수형 배열
int[] arr2 = {1, 2, 3, 4}; // 크기가 4인 정수형 배열
String[] arr3 = new String[5]; // 크기가 5인 문자열 배열
char[] arr5;
arr5 = new char[10]; // 크기가 10인 문자 배열
boolean[] arr4 = new boolean[]; // 오류 발생 (크기 미지정)
}
}
배열 요소 접근
배열의 요소에 접근하려면 배열 변수명 뒤에 대괄호 []를 붙이고, 그 안에 인덱스를 넣으면 됩니다. 인덱스는 0부터 시작합니다.
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[0]); // 첫 번째 요소 출력
System.out.println(arr[2]); // 세 번째 요소 출력
}
}
주의: 배열의 크기를 벗어난 인덱스에 접근하면 ArrayIndexOutOfBoundsException 예외가 발생합니다.
배열 요소 값 변경
배열의 요소는 인덱스를 통해 접근한 후 값을 변경할 수 있습니다.
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
System.out.println("변경 전");
System.out.println(arr[0]);
arr[0] = 10; // 첫 번째 요소 값을 10으로 변경
System.out.println("변경 후");
System.out.println(arr[0]);
}
}
반복문을 사용하여 배열의 모든 요소 접근
반복문을 사용하여 배열의 모든 요소에 접근할 수 있습니다. 배열의 크기는 arr.length로 얻을 수 있습니다.
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
반복문을 사용하여 배열의 모든 요소 값 변경
반복문을 사용하여 배열의 각 요소의 값을 변경할 수 있습니다.
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] * 10; // 각 요소의 값을 10배로 변경
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); // 변경된 값 출력
}
}
}
배열은 왜 0부터 시작일까요?
배열은 참조 자료형입니다. 배열의 변수명(예: arr)은 실제로 메모리의 주소값을 참조하고 있으며, 이 주소값을 통해 배열의 요소들이 저장된 위치를 확인할 수 있습니다. 배열의 요소들은 메모리 상에 순차적으로 저장되며, 각 요소의 위치는 메모리 주소로 관리됩니다.
참조 자료형과 기본 자료형의 차이
기본 자료형은 값 자체를 저장하는 반면, 참조 자료형은 메모리 주소를 저장합니다. 이는 아래 예시에서 확인할 수 있습니다.
기본 자료형 예시
public class Main {
public static void main(String[] args) {
int n1 = 10;
int n2 = n1;
n2 = 100;
System.out.println(n1); // 10
System.out.println(n2); // 100
}
}
위 코드에서 n1과 n2는 독립적인 값으로 저장되며, 하나의 값이 변경되어도 다른 값에 영향을 미치지 않습니다.
참조 자료형 예시
public class Main {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4};
int[] arr2 = arr1;
arr2[0] = 100;
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]); // 100, 2, 3, 4
}
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]); // 100, 2, 3, 4
}
}
}
위 코드에서는 arr2[0]을 변경하자 arr1[0]의 값도 함께 변경되었습니다. 이는 배열이 메모리 주소를 참조하고 있기 때문에 발생한 현상입니다.
메모리 주소 확인
public class Main {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4};
int[] arr2 = arr1;
arr2[0] = 100;
// 주소값 확인하기
System.out.println(arr1); // [I@some_address
System.out.println(arr2); // [I@some_address
}
}
실제로 arr1과 arr2가 동일한 메모리 주소를 가지고 있음을 확인할 수 있습니다.
쉽게 생각하기
배열은 참조 자료형으로, 집 주소를 가지고 있다고 생각할 수 있습니다. arr2가 arr1의 집 주소를 복사하여 같은 집 주소를 가지게 되었고, arr2가 집 인테리어를 바꾸면 arr1도 영향을 받는다고 이해하면 됩니다.
값 복사 방법
주소가 아닌 값을 복사하려면 두 가지 방법을 사용할 수 있습니다.
1. 새로운 배열을 생성하고 for문을 사용하여 요소 복사
public class Main {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4};
int[] arr2 = new int[arr1.length];
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
arr2[0] = 100;
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]); // 1, 2, 3, 4
}
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]); // 100, 2, 3, 4
}
}
}
2. Arrays.copyOf 메소드 사용하여 복사
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4};
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
arr2[0] = 100;
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]); // 1, 2, 3, 4
}
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]); // 100, 2, 3, 4
}
}
}
위 방법을 사용하면 배열의 각 요소 값을 복사하여, 원본 배열과는 독립적인 배열을 생성할 수 있습니다.
'자료구조' 카테고리의 다른 글
[자료구조] 여러가지 배열 종류 (0) | 2024.10.31 |
---|---|
[자료구조] 큐(Queue) (0) | 2024.10.12 |
[자료구조] 스택(Stack) Java 예제 포함 (1) | 2024.10.11 |
[자료구조] Linked List (0) | 2024.08.15 |