CodeGym /행동 /JAVA 25 SELF /“무한 배열” — ArrayList<T>

“무한 배열” — ArrayList<T>

JAVA 25 SELF
레벨 12 , 레슨 1
사용 가능

1. 소개

이것은 보너스 레벨의 첫 번째 강의입니다. 우리는 이미 OOP 학습에 바짝 다가왔습니다. 여러분의 흥미를 좀 더 돋우고 살짝 미리 보기로 가 보죠 😈. 현재 레벨에서는 5가지 흥미로운 것을 다룹니다:

  1. ♾️ 무한 배열을 만드는 법을 배웁니다
  2. 📖 이어서 “개인 사전”을 관리합니다
  3. 💾 그다음 파일 작업을 살짝 맛봅니다
  4. 🌐 이후 인터넷에서 이미지를 다운로드하는 법을 배웁니다
  5. 🛰️ 마지막 강의에서는 국제우주정거장(ISS)을 실시간으로 추적해 봅니다

이 모든 것이 내부에서 어떻게 동작하는지는 이후 레벨에서 배우게 될 거예요. 오늘은 제가 제공하는 도구들을 그냥 사용해 보면서 익숙해지는 데 집중합니다. 흥미가 생겼나요? 그럼 시작해 봅시다 😇.

일반 배열을 복습해 봅시다

Java의 일반 배열을 떠올려 봅시다:

int[] arr = new int[10];

아주 유용하지만 몇 가지 제약이 있습니다. 크기가 고정되어 있으며, 새 배열을 만들지 않는 이상 요소를 추가하거나 제거할 수 없습니다. 하지만 필요에 따라 늘었다 줄었다 하는 배열이 필요할 때가 있죠. 그럴 때 훌륭한 해법이 바로 동적 배열 ArrayList입니다!

ArrayList는 자동으로 커지고 줄어드는 “똑똑한 배열”입니다. 일반 배열은 크기가 고정되어 있지만, ArrayList는 새로운 요소가 들어올 공간을 스스로 관리합니다.

무한 배열 생성하기

우리의 ArrayList를 만들려면 다음과 같이 작성합니다:

ArrayList<String> array = new ArrayList<String>()

그다음 요소를 추가할 수 있습니다:

array.add("마샤");
array.add("카티아");

정수를 위한 동적 배열 만들기

이미 짐작하셨겠지만, 동적 배열의 요소 타입은 꺾쇠괄호 안에 지정합니다. 기본형(primitive)은 직접 사용할 수 없고, 해당 기본형의 래퍼 타입으로 바꿔야 합니다.

예시:

ArrayList<Integer> numbers = new ArrayList<Integer>();      // int
ArrayList<Double> fees = new ArrayList<Double>();            // double
ArrayList<Boolean> yesList = new ArrayList<Boolean>();       // boolean
ArrayList<Character> chars = new ArrayList<Character>();     // char

우리의 ArrayList는 요소 접근을 위한 [index] 표기를 지원하지 않지만, 필요한 기능을 모두 충족하는 전용 메서드들이 있습니다. 가장 흥미로운 것들을 살펴봅시다.

2. 메서드 add(element) — 요소 추가

리스트로 가장 먼저 하는 일은 데이터를 추가하는 것입니다. 이를 위해 add 메서드를 사용합니다. 이 메서드는 요소를 리스트의 끝에 추가합니다.

ArrayList<String> todo = new ArrayList<>(); // 할 일 목록
todo.add("ArrayList를 배우기");
todo.add("차를 끓이기");
todo.add("산책하기");

이 세 줄을 실행하면 문자열 3개로 이루어진 리스트가 만들어집니다. 배열과 달리 크기를 미리 지정할 필요가 없으며, 추가하는 대로 자동으로 커집니다.

아주 편리하죠. 빈 리스트로 시작해서 사용자 동작이나 프로그램 입력에 따라 점진적으로 채워 넣을 수 있습니다.

3. 메서드 get(index) — 인덱스로 접근

각 요소에는 고유한 순번 — 인덱스가 있습니다. 인덱스는 항상 0부터 시작합니다. 즉, 첫 번째 요소의 번호는 0, 두 번째는 1이고, 그다음도 같은 방식입니다.

번호로 요소를 가져오려면 get 메서드를 사용합니다.

String task = todo.get(1);
System.out.println("두 번째 할 일: " + task);

출력:

두 번째 할 일: 차를 끓이기

중요한 점: 존재하지 않는 인덱스(예: 리스트에 요소가 3개뿐인데 todo.get(10) 호출)에 접근하면 IndexOutOfBoundsException 오류가 발생합니다. 따라서 인덱스가 유효하다는 확신이 있거나, size()로 리스트 크기를 확인해야 합니다.

4. 메서드 set(index, element) — 요소 교체

가끔 리스트의 요소를 바꿔야 할 때가 있습니다. 이 경우 삭제 후 다시 추가할 필요 없이 set 메서드를 사용하면 됩니다.

todo.set(1, "커피 내리기"); 
System.out.println("이제 두 번째 할 일: " + todo.get(1));

출력:

이제 두 번째 할 일: 커피 내리기

따라서 set은 리스트를 “실시간으로” 업데이트하는 방법입니다.

5. 메서드 remove(index) — 요소 삭제

ArrayList에서 요소는 인덱스로 삭제할 수 있습니다.

todo.remove(0); 
System.out.println("이제 첫 번째 할 일: " + todo.get(0));

출력:

이제 첫 번째 할 일: 커피 내리기

우리는 첫 번째 요소(인덱스 0)를 삭제했습니다. 이제 두 번째가 첫 번째가 되었고, 세 번째였던 요소가 두 번째가 되었습니다. 중요한 점: 삭제 후 리스트의 요소들은 앞으로 당겨집니다.

이 점은 초보자에게 종종 의외로 느껴질 수 있습니다. 삭제 후 인덱스가 다시 매겨진다는 것을 항상 염두에 두세요.

6. 메서드 size() — 리스트 크기 확인

size 메서드는 리스트의 요소 개수를 반환합니다. 배열의 length 속성과 비슷하지만, ArrayList에서는 메서드입니다.

System.out.println("총 할 일: " + todo.size());

출력:

총 할 일: 2

종종 size는 모든 요소를 순회하는 반복문에서 사용됩니다:

for (int i = 0; i < todo.size(); i++) 
{
    System.out.println(todo.get(i));
}

7. 메서드 contains(element) — 포함 여부 확인

리스트에 원하는 요소가 있는지 확인하려면 contains를 사용할 수 있습니다. 이 메서드는 true 또는 false를 반환합니다.

System.out.println(todo.contains("산책하기"));
System.out.println(todo.contains("차를 끓이기"));

출력:

true
false

중복을 피하고 싶거나 “그런 요소가 리스트에 있는가?”를 확인할 때 매우 유용한 메서드입니다.

8. 요소 순회

리스트를 순회하는 방법은 두 가지가 있습니다.

인덱스 기반 for 루프

요소의 번호(인덱스)가 중요할 때 사용하는 방법입니다.

for (int i = 0; i < todo.size(); i++) 
{
    System.out.println(i + ": " + todo.get(i));
}

for-each 루프

번호가 필요 없고 모든 요소를 그냥 보고 싶다면 for-each 루프를 사용하세요.

for (String task : todo) 
{
    System.out.println("할 일: " + task);
}

이런 루프는 더 짧고 읽기 쉽습니다.

9. 실습: ArrayList를 애플리케이션에서 사용하기

추가하고 출력할 수 있는 할 일 목록을 만들어 봅시다:

import java.util.ArrayList;
import java.util.Scanner;

public class TodoApp 
{
    public static void main(String[] args) 
    {
        ArrayList<String> todo = new ArrayList<>();
        Scanner console = new Scanner(System.in);

        while (true) 
        {
            System.out.print("할 일을 입력하세요(빈 줄 입력 시 종료): ");
            String task = console.nextLine();
            if (task.isEmpty()) break;
            todo.add(task);
        }

        System.out.println("할 일 목록:");
        for (int i = 0; i < todo.size(); i++) 
        {
            System.out.println((i + 1) + ". " + todo.get(i));
        }
    }
}

우리의 무한 배열이 마음에 들었길 바랍니다. 이것은 여러분이 처음 접한 Java 컬렉션입니다. 다른 컬렉션들도 분명 마음에 드실 거예요.

1
과제
JAVA 25 SELF, 레벨 12, 레슨 1
잠금
요소 추가 및 가져오기
요소 추가 및 가져오기
1
과제
JAVA 25 SELF, 레벨 12, 레슨 1
잠금
요소 교체 및 제거
요소 교체 및 제거
1
과제
JAVA 25 SELF, 레벨 12, 레슨 1
잠금
리스트에 요소가 있는지 확인
리스트에 요소가 있는지 확인
1
과제
JAVA 25 SELF, 레벨 12, 레슨 1
잠금
사용자 입력 할 일 목록
사용자 입력 할 일 목록
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION