Java 배열과 ArrayList

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 의 두 가지 기본적인 데이터 구조인 배열 (Arrays) 과 ArrayList 에 대해 자세히 알아보겠습니다. 이러한 구조는 많은 프로그래밍 작업에 필수적인 데이터 컬렉션을 저장하고 조작할 수 있게 해줍니다. 기본적인 배열부터 시작하여 더 유연한 ArrayList 로 이동할 것입니다. 이 랩이 끝나면 Java 에서 배열과 ArrayList 를 모두 생성, 조작 및 사용할 수 있게 됩니다.

다음 내용을 다룰 것입니다:

  1. 배열 생성 및 사용
  2. 배열 요소 접근 및 수정
  3. ArrayList 소개
  4. ArrayList 에서 요소 추가, 제거 및 접근
  5. 배열과 ArrayList 간 변환

데이터를 정리하는 작업을 시작해 봅시다!

배열 생성 및 사용

배열은 Java 에서 동일한 유형의 여러 요소를 저장할 수 있는 기본적인 데이터 구조입니다. 배열을 각 상자에 특정 유형의 항목 하나를 담을 수 있는 일련의 상자라고 생각하십시오.

  1. 프로젝트 디렉토리에서 ArrayDemo.java라는 파일을 엽니다.

    public class ArrayDemo {
        public static void main(String[] args) {
            // 여기에 코드를 추가합니다.
        }
    }
    

    이것은 Java 프로그램의 기본 구조입니다. main 메서드는 프로그램이 실행을 시작하는 곳입니다.

  2. 이제 정수 배열을 선언하고 초기화해 보겠습니다. main 메서드 안에 다음 줄을 추가합니다.

    int[] numbers = {1, 2, 3, 4, 5};
    

    이 줄은 numbers라는 정수 배열을 생성하고 1, 2, 3, 4, 5 의 값으로 초기화합니다. 대괄호 []numbers가 배열임을 Java 에 알려줍니다.

  3. 배열의 요소를 출력해 보겠습니다. 배열 선언 뒤에 다음 줄을 추가합니다.

    System.out.println("The elements of the array are:");
    for (int i = 0; i < numbers.length; i++) {
        System.out.println("Element at index " + i + ": " + numbers[i]);
    }
    

    이 코드는 for 루프를 사용하여 배열을 반복합니다. numbers.length는 배열의 크기를 제공하고, numbers[i]는 인덱스 i의 요소에 접근합니다.

    Java array elements output

  4. 파일을 저장한 다음 프로그램을 컴파일하고 실행합니다.

    javac ~/project/ArrayDemo.java
    java -cp ~/project ArrayDemo
    

    다음과 유사한 출력을 볼 수 있습니다.

    The elements of the array are:
    Element at index 0: 1
    Element at index 1: 2
    Element at index 2: 3
    Element at index 3: 4
    Element at index 4: 5
    
  5. 이제 배열의 모든 요소의 합을 계산해 보겠습니다. 이전 루프 뒤에 이 코드를 추가합니다.

    int sum = 0;
    for (int number : numbers) {
        sum += number;
    }
    System.out.println("The sum of the elements is: " + sum);
    

    이 코드는 향상된 for 루프 (for-each 루프라고도 함) 를 사용하여 배열을 반복합니다. 인덱스가 필요하지 않은 경우 모든 요소를 살펴보는 더 간단한 방법입니다.

  6. 마지막으로 배열에서 최대값을 찾아보겠습니다. 이 코드를 추가합니다.

    int max = numbers[0];
    for (int i = 1; i < numbers.length; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
        }
    }
    System.out.println("The maximum value in the array is: " + max);
    

    이 코드는 첫 번째 요소를 최대값으로 가정하고, 각 후속 요소를 현재 최대값과 비교하여 더 큰 값이 발견되면 최대값을 업데이트하는 것으로 시작합니다.

  7. 프로그램을 다시 저장, 컴파일 및 실행합니다. 추가 출력을 볼 수 있습니다.

    The sum of the elements is: 15
    The maximum value in the array is: 5
    

    Java array output example

  8. Java 의 배열은 크기가 고정되어 있지만, 요소를 수정할 수 있습니다. 요소를 변경하고 수정된 배열을 출력해 보겠습니다. main 메서드의 끝에 이 코드를 추가합니다.

    numbers[2] = 10;
    System.out.println("\nAfter modifying the third element:");
    for (int number : numbers) {
        System.out.print(number + " ");
    }
    System.out.println();
    

    이 코드는 세 번째 요소 (인덱스 2) 의 값을 10 으로 변경한 다음 수정된 배열을 출력합니다.

  9. 프로그램을 다시 저장, 컴파일 및 실행합니다. 추가 출력을 볼 수 있습니다.

    After modifying the third element:
    1 2 10 4 5
    

축하합니다! 이제 배열을 생성하고, 요소에 접근하고, 값으로 계산을 수행하고, 요소를 수정했습니다. Java 의 배열은 크기가 고정되어 있으므로 배열을 생성한 후에는 길이를 변경할 수 없다는 점을 기억하십시오. 그러나 요소의 값은 변경할 수 있습니다.

ArrayList 소개

이제 배열을 사용했으니 ArrayList 를 소개하겠습니다. ArrayList 는 Java Collections Framework 의 일부이며 객체 목록을 더 유연하게 처리할 수 있는 방법을 제공합니다. 배열과 달리 ArrayList 는 크기가 동적으로 증가하거나 축소될 수 있습니다.

  1. 프로젝트 디렉토리에서 ArrayListDemo.java라는 파일을 엽니다.

    import java.util.ArrayList;
    
    public class ArrayListDemo {
        public static void main(String[] args) {
            // 여기에 코드를 추가합니다.
        }
    }
    

    맨 위에 있는 import 문을 확인하십시오. 이 문은 프로그램에서 ArrayList 클래스를 사용하려는 것을 Java 에 알려줍니다.

  2. 이제 String 의 ArrayList 를 만들어 보겠습니다. main 메서드 안에 이 줄을 추가합니다.

    ArrayList<String> fruits = new ArrayList<>();
    

    이것은 String 객체를 담을 수 있는 빈 ArrayList 를 생성합니다. <String> 부분은 "제네릭 (generic)"이라고 하며 ArrayList 가 포함할 요소의 유형을 지정합니다.

  3. ArrayList 에 몇 가지 요소를 추가해 보겠습니다. 다음 줄을 추가합니다.

    fruits.add("Apple");
    fruits.add("Banana");
    fruits.add("Cherry");
    

    add() 메서드는 목록의 끝에 요소를 추가합니다.

  4. 이제 ArrayList 를 출력해 보겠습니다. 이 코드를 추가합니다.

    System.out.println("Fruits in the list:");
    for (String fruit : fruits) {
        System.out.println(fruit);
    }
    

    이것은 배열에서 했던 것과 유사하게, 향상된 for 루프를 사용하여 ArrayList 를 반복합니다.

    팁: 출력을 보려면 언제든지 프로그램을 컴파일하고 실행할 수 있습니다. 또는 더 많은 코드를 계속 추가하고 마지막에 모두 실행할 수 있습니다.

  5. ArrayList 에는 많은 유용한 메서드가 있습니다. 몇 가지를 시도해 보겠습니다. 이 코드를 추가합니다.

    System.out.println("\nNumber of fruits: " + fruits.size());
    System.out.println("The second fruit is: " + fruits.get(1));
    

    size()는 ArrayList 의 요소 수를 반환하고, get(index)는 지정된 인덱스의 요소를 검색합니다.

  6. set() 메서드를 사용하여 ArrayList 의 요소를 바꿀 수도 있습니다. 이 코드를 추가합니다.

    // Before: [Apple, Banana, Cherry]
    fruits.set(1, "Blueberry");    // Replaces "Banana" with "Blueberry"
    System.out.println("\nAfter replacing the second fruit:");
    System.out.println(fruits);     // [Apple, Blueberry, Cherry]
    

    set(index, element)는 지정된 인덱스의 요소를 새 요소로 바꿉니다. ArrayList 크기는 동일하게 유지됩니다.

  7. 배열과 달리 ArrayList 는 add(index, element) 메서드를 사용하여 모든 위치에 요소를 삽입할 수 있습니다. 이것은 앞서 본 set()과 다릅니다. add()가 어떻게 작동하는지 살펴보겠습니다.

    // Before: [Apple, Blueberry, Cherry]
    fruits.add(1, "Blackberry");
    System.out.println("\nAfter inserting Blackberry at index 1:");
    System.out.println(fruits);
    // After: [Apple, Blackberry, Blueberry, Cherry]
    

    무슨 일이 일어났는지 이해해 봅시다.

    • add(1, "Blackberry")는 "Blackberry"를 인덱스 1 에 삽입합니다.
    • 인덱스 1 이상 (Blueberry, Cherry) 의 기존 요소는 자동으로 한 위치 오른쪽으로 이동합니다.
    • ArrayList 크기가 1 증가합니다.
    • 이것은 크기를 이동하거나 변경하지 않고 기존 요소를 바꾸는 set()과 다릅니다.

    차이점을 시각화하기 위해:

    // Using add(index, element) - inserts and shifts
    fruits.add(1, "Blackberry");    // [Apple, Blackberry, Blueberry, Cherry]
    
    // Using set(index, element) - replaces without shifting
    fruits.set(1, "Blackberry");    // [Apple, Blackberry, Cherry]
    
  8. ArrayList 에서 요소를 제거할 수도 있습니다. 이 코드를 추가합니다.

    fruits.remove("Cherry");
    System.out.println("\nAfter removing Cherry:");
    System.out.println(fruits);
    

    이것은 ArrayList 에서 "Cherry"의 첫 번째 발생을 제거합니다. 요소가 제거되면 후속 요소가 갭을 채우기 위해 왼쪽으로 이동합니다.

  9. 마지막으로 특정 요소가 ArrayList 에 있는지 확인해 보겠습니다.

    System.out.println("\nDoes the list contain Apple? " + fruits.contains("Apple"));
    System.out.println("Does the list contain Cherry? " + fruits.contains("Cherry"));
    

    contains() 메서드는 ArrayList 에 특정 요소가 포함되어 있는지 확인하고 부울 값을 반환합니다.

  10. 파일을 저장한 다음 프로그램을 컴파일하고 실행합니다.

    javac ~/project/ArrayListDemo.java
    java -cp ~/project ArrayListDemo
    

    다음과 유사한 출력을 볼 수 있습니다.

    Fruits in the list:
    Apple
    Banana
    Cherry
    
    Number of fruits: 3
    The second fruit is: Banana
    
    After replacing the second fruit:
    [Apple, Blueberry, Cherry]
    
    After inserting Blackberry at index 1:
    [Apple, Blackberry, Blueberry, Cherry]
    
    After removing Cherry:
    [Apple, Blackberry, Blueberry]
    
    Does the list contain Apple? true
    Does the list contain Cherry? false
    

축하합니다! 이제 ArrayList 를 생성하고, 요소를 추가 및 제거하고, 인덱스로 요소에 접근하고, 다양한 ArrayList 메서드를 사용했습니다. 요소를 삽입하고 이동하는 add()와 요소를 바꾸는 set()과 같은 작업 간의 중요한 차이점을 배웠습니다. ArrayList 는 필요에 따라 증가하고 축소할 수 있으므로 배열보다 더 많은 유연성을 제공합니다. 이것은 작업할 요소 수를 미리 알 수 없는 경우 매우 유용합니다.

배열과 ArrayList 간 변환

때로는 배열과 ArrayList 간에 변환해야 할 수 있습니다. Java 는 이를 수행하는 편리한 메서드를 제공합니다. 배열을 ArrayList 로, 그리고 그 반대로 변환하는 방법을 살펴보겠습니다.

  1. 프로젝트 디렉토리에서 ConversionDemo.java라는 파일을 엽니다.

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class ConversionDemo {
        public static void main(String[] args) {
            // 여기에 코드를 추가합니다.
        }
    }
    

    맨 위에 있는 import 문을 확인하십시오. 변환에 필요한 클래스를 가져오고 있습니다.

  2. 배열을 ArrayList 로 변환하는 것부터 시작해 보겠습니다. main 메서드 안에 이 코드를 추가합니다.

    String[] colorArray = {"Red", "Green", "Blue"};
    List<String> colorList = Arrays.asList(colorArray);
    
    System.out.println("Array converted to ArrayList:");
    System.out.println(colorList);
    

    Arrays.asList()는 배열을 List로 변환합니다. 이것은 원래 배열에 의해 지원되는 고정 크기 목록을 생성합니다.

  3. ArrayList 를 수정하고 원래 배열에 어떤 일이 발생하는지 살펴보겠습니다. 이 코드를 추가합니다.

    colorList.set(1, "Yellow");
    
    System.out.println("\nAfter modifying the ArrayList:");
    System.out.println(colorList);
    System.out.println("Original array after ArrayList modification:");
    System.out.println(Arrays.toString(colorArray));
    

    Arrays.toString()은 배열을 출력하는 편리한 메서드입니다.

  4. 이제 ArrayList 를 배열로 변환해 보겠습니다. 이 코드를 추가합니다.

    ArrayList<Integer> numberList = new ArrayList<>();
    numberList.add(1);
    numberList.add(2);
    numberList.add(3);
    
    Integer[] numberArray = numberList.toArray(new Integer[0]);
    
    System.out.println("\nArrayList converted to array:");
    System.out.println(Arrays.toString(numberArray));
    

    ArrayList 의 toArray() 메서드를 사용하여 배열로 변환합니다. new Integer[0]을 인수로 전달하는데, 이는 생성될 배열의 유형과 크기에 대한 힌트 역할을 합니다.

  5. 마지막으로 배열을 수정하고 ArrayList 에 영향을 미치는지 확인해 보겠습니다. 이 코드를 추가합니다.

    numberArray[0] = 100;
    System.out.println("\nAfter modifying the array:");
    System.out.println("Array: " + Arrays.toString(numberArray));
    System.out.println("ArrayList: " + numberList);
    
  6. 파일을 저장한 다음 프로그램을 컴파일하고 실행합니다.

    javac ~/project/ConversionDemo.java
    java -cp ~/project ConversionDemo
    

    다음과 유사한 출력을 볼 수 있습니다.

    Array converted to ArrayList:
    [Red, Green, Blue]
    
    After modifying the ArrayList:
    [Red, Yellow, Blue]
    Original array after ArrayList modification:
    [Red, Yellow, Blue]
    
    ArrayList converted to array:
    [1, 2, 3]
    
    After modifying the array:
    Array: [100, 2, 3]
    ArrayList: [1, 2, 3]
    

이 데모는 배열과 ArrayList 가 서로 어떻게 변환될 수 있는지 보여줍니다. 동작의 차이점을 아는 것이 중요합니다.

  • Arrays.asList()를 사용하여 배열을 List 로 변환하면 결과 List 는 원래 배열에 의해 지원됩니다. 즉, List 에 대한 변경 사항은 배열에 반영되고, 그 반대도 마찬가지입니다.
  • toArray()를 사용하여 ArrayList 를 배열로 변환하면 ArrayList 와 독립적인 새 배열이 생성됩니다. 이 새 배열에 대한 변경 사항은 원래 ArrayList 에 영향을 미치지 않습니다.

Java 에서 서로 다른 컬렉션 유형으로 작업할 때, 특히 한 유형을 다른 유형보다 선호할 수 있는 API 또는 라이브러리와 인터페이스할 때 이러한 변환과 해당 동작을 이해하는 것이 중요합니다.

요약

이 랩에서는 Java 의 두 가지 기본적인 데이터 구조인 배열과 ArrayList 를 살펴보았습니다. 배운 내용을 요약해 보겠습니다.

  1. 배열:

    • int[] numbers = {1, 2, 3, 4, 5}; 구문을 사용하여 배열을 생성하고 초기화했습니다.
    • numbers[0]과 같은 인덱스 표기법을 사용하여 배열 요소에 접근하는 방법을 배웠습니다.
    • 전통적인 for 루프와 향상된 for 루프를 모두 사용하여 배열을 반복했습니다.
    • 합계 및 최대값 찾기와 같은 배열 요소로 계산을 수행했습니다.
    • 배열은 고정된 크기를 갖지만 요소를 수정할 수 있다는 것을 확인했습니다.
  2. ArrayList:

    • ArrayList<String> fruits = new ArrayList<>();를 사용하여 ArrayList 를 생성했습니다.
    • add()로 요소를 추가하고, remove()로 요소를 제거하고, get()으로 요소에 접근하는 방법을 배웠습니다.
    • size(), set(), contains()와 같은 메서드를 사용하여 ArrayList 를 사용했습니다.
    • ArrayList 는 동적으로 증가하고 축소될 수 있으며 배열보다 더 많은 유연성을 제공한다는 것을 확인했습니다.
  3. 배열과 ArrayList 간 변환:

    • Arrays.asList()를 사용하여 배열을 ArrayList 로 변환했습니다.
    • toArray() 메서드를 사용하여 ArrayList 를 배열로 변환했습니다.
    • 변환된 컬렉션을 수정할 때의 다른 동작을 관찰했습니다.

배열과 ArrayList 는 Java 프로그래밍의 필수 도구입니다. 배열은 고정된 수의 요소로 작업하는 데 적합하며 메모리 사용 측면에서 더 효율적일 수 있습니다. 반면에 ArrayList 는 더 많은 유연성과 컬렉션을 조작하기 위한 풍부한 메서드 집합을 제공합니다.

Java 여정을 계속 진행하면서 배열과 ArrayList 를 모두 자주 사용하게 될 것입니다. 둘 중 어떤 것을 선택할지는 종종 특정 요구 사항에 따라 다릅니다. 작업할 요소의 정확한 수를 알고 있다면 배열이 더 나을 수 있습니다. 증가하거나 축소할 수 있는 동적 컬렉션이 필요하거나 ArrayList 에서 제공하는 추가 메서드가 필요한 경우 ArrayList 가 더 나은 선택입니다.