프로그래밍 언어/JAVA

ArrrayList<E>

· 코딩마이데이

ArrayList<E>(이하 ArrayList)는 가변 크기의 배열을 구현한 컬렉션 클래스로서 경로명은 java.util.ArrayList이며, Vector 클래스와 거의 동일합니다. 크게 다른 점은 ArrayList는 스레드 간에 동기화를 지원하지 않기 때문에, 다수의 스레드가 동시에 ArrayList에 요소를 삽입하거나 삭제할 때 ArrayList의 데이터가 훼손될 유려가 있습니다. 하지만 멀티스레드 동기화를 위한 시간 소모가 없기 때문에, ArrayList는 Vector보다 속도가 빨라, 단일 스레드 응용에는 더 효과적입니다.

ArrayList 객체의 내부 구성을 보여줍니다. 내부의 배열을 가지고 있으며 이 배열을 가변 크기로 관리합니다. ArrayList는 인덱스로 요소를 접근할 수 있으며, 인덱스는 0부터 시작합니다.

ArrayList<String> al = new ArrayList<String>() 객체의 내부 구성

메소드 설명
boolean add(E element) ArrayList의 맨 뒤에 element 추가
void add(int index, E element) 인덱스 index 위치에 element 삽입
boolean addAll(Collection<? extends E> c) 컬렉션 c의 모든 요소를 ArrayList의 맨 뒤에 추가
void clear() ArrayList의 모든 요소 삭제
boolean contains(Object o) ArrayList가 지정된 객체가 포함되고 있으면 true 리턴
E elementAt(int index) index 인덱스의 요소 리턴
E get(int index) index 인덱스의 요소 리턴
int indexOf(Object o) o와 같은 첫 번째 요소의 인덱스 리턴, 없으면 -1 리턴
boolean isEmpty() ArrayList가 비어 있으면 true 리턴
E remove(int index) index 인덱스의 요소 삭제
boolean remove(Object o) o와 같은 첫 번째 요소를 ArrayList에서 삭제
int size() ArrayList가 포함하는 요소의 개수 리턴
Object[] toArray() ArrayList의 모든 요소를 포함하는 배열 리턴

 

ArrayList의 생성

문자열만 다루는 ArrayList를 생성해봅시다.

ArrayList<String> a = new ArrayList<String>();
// Java 7부터 ArrayList<String> a = new ArrayList<>();로 간략히 쓸 수 있음
// Java 10부터 var a = new ArrayList<String>();로 간략히 쓸 수 있음

 

a는 문자열만 삽입하고 검색할 수 있는 ArrayList 객체입니다. ArrayList는 스스로 용량을 조절하기 때문에 용량에 대해 신경 쓸 필요가 없습니다.

 

ArrayList에 요소 삽입

add() 메소드를 사용하여 다음과 같이 3개의 문자열을 삽입해봅시다.

a.add("Hello");
a.add("Hi");
a.add("Java");

 

a에 삽입할 수 있는 요소는 String 타입만 사능합니다. a에 문자열이 아닌 객체나 값을 삽입하면 다음과 같이 오류가 발생합니다. 

a.add(5); // 컴파일 오류. 정수 삽입 불가
a.add(new Point(3, 5)); // 컴파일 오류. Point 객체 삽입 불가

 

ArrayList에도 Vector와 마찬가지로 null을 삽입할 수 있습니다.

a.add(null);

 

add() 메소드를 이용하면 ArrayList의 중간에 요소를 삽입할 수 있습니다. 다음은 인덱스 2의 위치에 "Sahni"를 삽입하는 코드입니다.

a.add(2, "Sahni");

 

"Sahni"를 인덱스 2에 삽입하고 기존의 인덱스 2와 그 뒤에 있는 요소들을 한 자리씩 뒤로 이동시킨다. 하지만, 이 코드의 실행 전, ArrayList에 들어 있는 요소의 개수가 2보다 작으면 예외가 발생합니다. add()는 끝이나 중간에만 요소를 삽입합니다.

 

ArrayList 내의 요소 알아내기

get()이나 elementAt() 메소드를 이용하면 ArrayList 내의 요소를 알아낼 수 있습니다. 다음 코드는 인덱스 1의 위치에 있는 요소를 리턴합니다.

String str = a.get(1); // "Hi" 리턴

 

ArrayList에 크기 알아내기

size() 메소드를 호출하면 현재 ArrayList에 들어 있는 요소의 개수를 알아낼 수 있습니다.

int len = a.size(); // ArrayList에 들어 있는 요소의 개수

 

ArrayList는 벡터와 갈리 현재 용량을 리턴하는 메소드가 없습니다.

 

ArrayList에서 요소 삭제

remove() 메소드를 이용하면 ArrayList 내 임의의 인덱스에 있는 요소를 삭제할 수 있습니다. 다음 코드는 인덱스 1의 위치에 있는 요소를 삭제합니다. 이 결과 뒤에 있는 요소들이 한 자리씩 앞으로 이동합니다.

a.remove(1); // 인덱스 1의 위치에 있는 요소 삭제

 

다음과 같이 객체 레퍼런스를 이용하여 remove()를 호출할 수도 있습니다.

String s = new String("bye");
a.add(s);
...
a.remove(s); // a에서 문자열 s 삭제

 

ArrayList에 있는 모든 요소를 삭제하려면 다음과 같이 clear()를 호출합니다.

a.clear();

 

ArrayList 컬렉션의 생성, 요소 삽입, 삭제 등 ArrayList를 다루는 과정은 다음과 같습니다.

 

ArrayList<String>의 생성 요소 삽입 삭제 사례

 

문자열 입력받아 ArrayList에 저장

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

public class ArrayListEx {
    public static void main(String[] args) {
        // 문자열이 삽입 가능한 ArrayList 생성
        ArrayList<String> a = new ArrayList<>();

        // 키보드로부터 4개의 이름을 입력받아 ArrayList에 삽입
        Scanner scanner = new Scanner(System.in); // Scanner 객체 생성
        for (int i = 0; i < 4; i++) {
            System.out.print("이름을 입력하세요>>");
            String s = scanner.next(); // 키보도로부터 이름을 입력
            a.add(s); // ArrayList 컬렉션에 삽입
        }

        // ArrayList에 들어 있는 모든 이름 출력
        for (int i = 0; i < a.size(); i++) {
            String name = a.get(i); // ArrayList의 i 번째 문자열 앋어오기
            System.out.print(name + " ");
        }

        // 가장 긴 이름 출력
        int longestIndex = 0; // 현재 가장 긴 이름이 있는 ArrayList 내의 인덱스
        for (int i = 1; i < a.size(); i++) {
            if (a.get(longestIndex).length() < a.get(i).length()) // 이름 길이 비교
                longestIndex = i; // i번째 이름이 더 긴 이름임
        }
        System.out.println("\n가장 긴 이름은 : " + a.get(longestIndex));
        scanner.close();
    }
}

 

실행 결과

이름을 입력하세요>>Mike
이름을 입력하세요>>Jane
이름을 입력하세요>>Ashley
이름을 입력하세요>>Helen
Mike Jane Ashley Helen 
가장 긴 이름은 : Ashley

 

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

HashMap<K, V>  (0) 2025.04.05
컬렉션의 순차 검색을 위한 Iterator  (0) 2025.04.02
Vector<E>  (0) 2025.03.28
컬렉션과 제네릭  (0) 2025.03.24
Calendar 클래스  (0) 2025.03.21