[Java 7강] 배열과 ArrayList 완벽 가이드
배열(Array) 기본 개념
배열(Array)은 여러 개의 데이터를 하나의 변수에 저장할 수 있도록 도와주는 자료구조이다. 자바에서는 배열을 활용하여 동일한 데이터 타입의 값을 연속적으로 저장할 수 있다.
1. 배열이란?
배열은 같은 데이터 타입을 가진 요소들을 순차적으로 저장하는 자료구조이다. 배열을 사용하면 여러 개의 변수를 선언하는 대신, 하나의 변수로 여러 개의 데이터를 관리할 수 있다.
예를 들어, 학생의 시험 점수를 저장할 때 개별 변수로 선언하면 다음과 같다.
int score1 = 85;
int score2 = 90;
int score3 = 78;
int score4 = 92;
int score5 = 88;
하지만 배열을 사용하면 더 효율적으로 관리할 수 있다.
int[] scores = {85, 90, 78, 92, 88};
2. 배열의 특징
- 고정된 크기: 한 번 크기가 정해지면 변경할 수 없음
- 동일한 데이터 타입: 배열의 모든 요소는 동일한 타입이어야 함
- 인덱스(0부터 시작): 배열의 첫 번째 요소는 0번 인덱스부터 시작
- 연속적인 메모리 공간 할당: 배열 요소들은 메모리에서 연속적으로 저장됨
3. 배열 선언 및 초기화
자바에서 배열을 선언하는 기본 문법은 다음과 같다.
데이터타입[] 배열이름;
예제:
int[] numbers;
String[] names;
배열을 선언한 후에는 new 키워드를 사용하여 크기를 지정해야 한다.
int[] numbers = new int[5]; // 크기가 5인 정수 배열 선언
초기화하면서 값을 할당할 수도 있다.
int[] numbers = {10, 20, 30, 40, 50};
String[] names = {"Alice", "Bob", "Charlie"};
4. 배열의 요소 접근
배열의 요소는 인덱스(index)를 사용하여 접근할 수 있다. 배열의 인덱스는 0부터 시작하며, 배열이름[인덱스] 형식으로 값을 가져오거나 변경할 수 있다.
int[] numbers = {10, 20, 30, 40, 50};
System.out.println(numbers[0]); // 첫 번째 요소 출력 (10)
numbers[2] = 100; // 세 번째 요소 변경
System.out.println(numbers[2]); // 변경된 값 출력 (100)
5. 배열의 길이
배열의 길이는 .length 속성을 사용하여 확인할 수 있다.
int[] numbers = {10, 20, 30, 40, 50};
System.out.println("배열의 크기: " + numbers.length); // 5 출력
6. 배열 활용 예제 (반복문과 함께 사용)
배열은 for문 또는 for-each문과 함께 사용하여 효율적으로 데이터를 처리할 수 있다.
public class ArrayExample {
public static void main(String[] args) {
int[] scores = {85, 90, 78, 92, 88};
// 일반 for문 사용
for (int i = 0; i < scores.length; i++) {
System.out.println("학생 " + (i+1) + "의 점수: " + scores[i]);
}
// 향상된 for문 사용
for (int score : scores) {
System.out.println("점수: " + score);
}
}
}
2. 배열의 특징
- 고정된 크기: 한 번 크기가 정해지면 변경할 수 없음
- 동일한 데이터 타입: 배열의 모든 요소는 동일한 타입이어야 함
- 인덱스(0부터 시작): 배열의 첫 번째 요소는 0번 인덱스부터 시작
- 연속적인 메모리 공간 할당: 배열 요소들은 메모리에서 연속적으로 저장됨
3. 1차원 배열과 다차원 배열
3.1 1차원 배열
1차원 배열은 단순히 한 줄로 데이터를 저장하는 배열이다. 각 요소는 인덱스를 사용하여 접근할 수 있다.
1차원 배열 선언 및 사용 예제:
int[] numbers = {10, 20, 30, 40, 50};
System.out.println(numbers[0]); // 첫 번째 요소 출력 (10)
배열의 크기는 .length 속성을 사용하여 확인할 수 있다.
System.out.println("배열의 크기: " + numbers.length); // 5 출력
3.2 다차원 배열
다차원 배열은 배열 안에 또 다른 배열이 포함된 구조를 의미한다. 가장 많이 사용하는 형태는 2차원 배열이다.
2차원 배열 선언 및 초기화 예제:
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
System.out.println(matrix[1][2]); // 두 번째 행, 세 번째 열 값 (6)
2차원 배열을 동적으로 생성할 수도 있다.
int[][] dynamicArray = new int[3][3]; // 3x3 배열 생성
3차원 배열도 가능하지만, 초보자는 2차원 배열부터 이해하는 것이 중요하다.
int[][][] cube = new int[2][3][4]; // 2x3x4 크기의 3차원 배열
다차원 배열은 이중 반복문을 사용하여 출력할 수 있다.
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
4. 정리
- 1차원 배열: 한 줄로 데이터를 저장하는 배열
- 다차원 배열: 배열 내부에 또 다른 배열이 포함된 구조 (주로 2차원 배열 사용)
- 인덱스를 통해 개별 요소에 접근 가능
- 반복문을 활용하면 데이터 처리가 쉬워짐
배열의 선언 및 사용법
배열을 선언하는 방법은 다음과 같다:
1. 배열 선언
데이터타입[] 배열이름;
예제:
int[] numbers;
String[] names;
2. 배열 초기화
배열을 선언한 후에는 new 키워드를 사용하여 크기를 지정해야 한다.
int[] numbers = new int[5]; // 크기가 5인 정수 배열 선언
초기화하면서 값을 할당할 수도 있다.
int[] numbers = {10, 20, 30, 40, 50};
String[] names = {"Alice", "Bob", "Charlie"};
3. 배열 요소 접근
배열의 요소는 인덱스(index)를 사용하여 접근할 수 있다. 배열의 인덱스는 0부터 시작하며, 배열이름[인덱스] 형식으로 값을 가져오거나 변경할 수 있다.
int[] numbers = {10, 20, 30, 40, 50};
System.out.println(numbers[0]); // 첫 번째 요소 출력 (10)
numbers[2] = 100; // 세 번째 요소 변경
System.out.println(numbers[2]); // 변경된 값 출력 (100)
배열의 한계점과 ArrayList의 필요성
1. 배열의 한계점
배열은 고정된 크기를 가지며, 몇 가지 제약이 있다:
- 크기 변경 불가능: 배열의 크기는 선언 시 정해지며, 실행 중에 변경할 수 없다.
- 요소 추가/삭제가 어려움: 배열의 크기가 고정되어 있어 요소를 추가하거나 제거할 경우 새로운 배열을 생성해야 한다.
- 데이터 검색 비효율성: 특정 요소를 찾기 위해서는 배열을 처음부터 끝까지 탐색해야 할 수도 있다.
예제: 배열에서 요소를 추가하려면 새 배열을 만들어야 한다.
int[] numbers = {10, 20, 30};
int[] newNumbers = new int[4];
System.arraycopy(numbers, 0, newNumbers, 0, numbers.length);
newNumbers[3] = 40; // 새로운 요소 추가
2. ArrayList의 필요성
배열의 단점을 보완하기 위해 ArrayList를 사용할 수 있다. ArrayList는 크기가 동적으로 변하며, 데이터를 보다 유연하게 관리할 수 있다.
ArrayList의 주요 장점:
- 크기 동적 조정 가능: 필요에 따라 자동으로 크기가 조정됨
- 요소 추가/삭제가 용이함: add(), remove() 메서드를 사용하여 쉽게 요소를 추가/삭제할 수 있음
- 데이터 검색이 더 효율적임: 내장된 메서드(indexOf(), contains())를 활용하여 검색 성능 향상
ArrayList 사용 예제:
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40); // 동적으로 요소 추가 가능
numbers.remove(1); // 두 번째 요소(20) 삭제
System.out.println(numbers); // [10, 30, 40]
}
}
3. 정리
- 배열은 크기가 고정적이어서 유연성이 부족함
- ArrayList는 동적으로 크기 조정이 가능하며, 추가/삭제가 용이함
- 배열보다 검색, 관리, 확장성이 뛰어나므로 컬렉션 프레임워크를 활용하는 것이 유리함
실전 예제: 데이터 저장 및 검색
배열과 ArrayList를 활용하여 데이터를 저장하고 검색하는 방법을 살펴보자.
1. 배열을 이용한 데이터 검색 예제
public class ArraySearchExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
int target = 30;
boolean found = false;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == target) {
found = true;
System.out.println("값 " + target + "이(가) 인덱스 " + i + "에서 발견되었습니다.");
break;
}
}
if (!found) {
System.out.println("값을 찾을 수 없습니다.");
}
}
}
2. ArrayList를 이용한 데이터 검색 예제
import java.util.ArrayList;
public class ArrayListSearchExample {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
String target = "Charlie";
if (names.contains(target)) {
System.out.println("이름 " + target + "이(가) 리스트에 존재합니다.");
} else {
System.out.println("이름을 찾을 수 없습니다.");
}
}
}
3. 정리
- 배열을 사용하면 검색 시 반복문을 통해 요소를 직접 비교해야 함
- ArrayList는 contains() 메서드를 사용하여 더 쉽게 검색 가능
- ArrayList는 추가적인 기능을 제공하여 데이터 저장 및 검색을 더 효율적으로 수행할 수 있음
배열의 한계점과 ArrayList의 필요성
1. 배열의 한계점
배열은 고정된 크기를 가지며, 몇 가지 제약이 있다:
- 크기 변경 불가능: 배열의 크기는 선언 시 정해지며, 실행 중에 변경할 수 없다.
- 요소 추가/삭제가 어려움: 배열의 크기가 고정되어 있어 요소를 추가하거나 제거할 경우 새로운 배열을 생성해야 한다.
- 데이터 검색 비효율성: 특정 요소를 찾기 위해서는 배열을 처음부터 끝까지 탐색해야 할 수도 있다.
예제: 배열에서 요소를 추가하려면 새 배열을 만들어야 한다.
int[] numbers = {10, 20, 30};
int[] newNumbers = new int[4];
System.arraycopy(numbers, 0, newNumbers, 0, numbers.length);
newNumbers[3] = 40; // 새로운 요소 추가
2. ArrayList의 필요성
배열의 단점을 보완하기 위해 ArrayList를 사용할 수 있다. ArrayList는 크기가 동적으로 변하며, 데이터를 보다 유연하게 관리할 수 있다.
ArrayList의 주요 장점:
- 크기 동적 조정 가능: 필요에 따라 자동으로 크기가 조정됨
- 요소 추가/삭제가 용이함: add(), remove() 메서드를 사용하여 쉽게 요소를 추가/삭제할 수 있음
- 데이터 검색이 더 효율적임: 내장된 메서드(indexOf(), contains())를 활용하여 검색 성능 향상
ArrayList 사용 예제:
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40); // 동적으로 요소 추가 가능
numbers.remove(1); // 두 번째 요소(20) 삭제
System.out.println(numbers); // [10, 30, 40]
}
}
3. 정리
- 배열은 크기가 고정적이어서 유연성이 부족함
- ArrayList는 동적으로 크기 조정이 가능하며, 추가/삭제가 용이함
- 배열보다 검색, 관리, 확장성이 뛰어나므로 컬렉션 프레임워크를 활용하는 것이 유리함
실전 예제: 데이터 저장 및 검색
배열과 ArrayList를 활용하여 데이터를 저장하고 검색하는 방법을 살펴보자.
1. 배열을 이용한 데이터 검색 예제
public class ArraySearchExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
int target = 30;
boolean found = false;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == target) {
found = true;
System.out.println("값 " + target + "이(가) 인덱스 " + i + "에서 발견되었습니다.");
break;
}
}
if (!found) {
System.out.println("값을 찾을 수 없습니다.");
}
}
}
2. ArrayList를 이용한 데이터 검색 예제
import java.util.ArrayList;
public class ArrayListSearchExample {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
String target = "Charlie";
if (names.contains(target)) {
System.out.println("이름 " + target + "이(가) 리스트에 존재합니다.");
} else {
System.out.println("이름을 찾을 수 없습니다.");
}
}
}
3. 정리
- 배열을 사용하면 검색 시 반복문을 통해 요소를 직접 비교해야 함
- ArrayList는 contains() 메서드를 사용하여 더 쉽게 검색 가능
- ArrayList는 추가적인 기능을 제공하여 데이터 저장 및 검색을 더 효율적으로 수행할 수 있음