☕Java/☕입문편

[Java 7강] 배열과 ArrayList 완벽 가이드

itstory(Booho) 2024. 12. 9. 14:55
728x90

배열(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는 추가적인 기능을 제공하여 데이터 저장 및 검색을 더 효율적으로 수행할 수 있음


 

728x90
반응형