ArrayList는 자바에서 기본적으로 많이 사용되는 클래스다.
ArrayList는 자바의 List 인터페이스를 상속받은 여러 클래스 중 하나이다.
일반 배열과 동일하게 연속된 메모리 공간을 사용하며 인덱스는 0부터 시작한다.
ArrayList
배열과의 차이점은 배열은 크기가 고정인 반면 ArrayList는 크기가 가변적으로 변한다는 것이다.
내부적으로 저장이 가능한 메모리 용량(Capacity)이 있으며 현재 사용 중인 공간의 크기(Size)가 있다.
만약 현재 가용량(Capacity) 이상을 저장하려고 할 때 더 큰 공간의 메모리를 새롭게 할당한다.
자바의 ArrayList를 활용하는 방법을 알아보자.
1. ArrayList 생성
자바에서 ArrayList를 사용하려면 아래 구문을 먼저 추가해야 한다.
import java.util.ArrayList;
ArrayList의 생성은 다음과 같은 구문들로 가능하다!
ArrayList<Integer> integers1 = new ArrayList<Integer>(); // 타입 지정
ArrayList<Integer> integers2 = new ArrayList<>(); // 타입 생략 가능
ArrayList<Integer> integers3 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
ArrayList<Integer> integers4 = new ArrayList<>(integers1); // 다른 Collection값으로 초기화
ArrayList<Integer> integers5 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // Arrays.asList()
보통 생성할 때는 new ArrayList<>()와 같이 타입을 생략해서 작성한다.
ArrayList를 생성할 때 Set이나 다른 ArrayList를 전달하면 해당 Collections의 값들로 초기한다.
마지막으로 가변 인자를 전달받는 Arrays.asList()를 사용하면 기본 값들로 생성 가능하다.
2. ArrayList 엘레멘트 추가/변경
ArrayList를 생성한 후 add() 메소드로 엘레멘트를 추가할 수 있다.
또한 set() 메소드로 기존에 추가된 값을 변경하는 것도 가능하다.
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> colors = new ArrayList<>();
// add() method
colors.add("Black");
colors.add("White");
colors.add(0, "Green");
colors.add("Red");
// set() method
colors.set(0, "Blue");
System.out.println(colors);
}
}
add()는 기본적으로 리스트의 가장 끝에 값을 추가한다.
별도로 인덱스를 지정하면 해당 인덱스에 값이 추가되고 그 인덱스부터의 값들이 1 칸씩 밀린다.
결과는 아래와 같이 출력된다.
결과
Black과 White는 순서대로 추가가 되며 Green이 첫 번째에 추가되면서 Black과 White는 각각 한 칸씩 밀리게 된다.
그리고 Red가 맨 끝에 다시 추가되는 것을 확인할 수 있다.
마지막으로 set() 메소드를 통해 가장 앞(Index: 0)의 Green이 Blue로 변경된다.
3. ArrayList 엘레멘트 삭제
추가했던 값을 삭제할 때는 remove() 메소드를 호출합니다.
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> colors = new ArrayList<>(Arrays.asList("Black", "White", "Green", "Red"));
String removedColor = colors.remove(0);
System.out.println("Removed color is " + removedColor);
colors.remove("White");
System.out.println(colors);
colors.clear();
System.out.println(colors);
}
}
삭제할 때는 엘레멘트의 인덱스를 입력하거나 엘레멘트를 직접 입력할 수 있다.
인덱스를 통해 삭제할 경우 삭제되는 엘레멘트를 리턴받을 수 있다.
값을 지움과 동시에 해당 값으로 별도의 작업이 필요한 경우 리턴을 받아서 사용하면 된다.
ArrayList 안의 내용을 전체 삭제할 때는 clear()를 호출하면 된다.
4. ArrayList 전체 값 확인
ArrayList의 모든 값들을 순회해서 출력하고 싶은 경우 다양한 방법을 사용할 수 있다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.ListIterator;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> colors = new ArrayList<>(Arrays.asList("Black", "White", "Green", "Red"));
// for-each loop
for (String color : colors) {
System.out.print(color + " ");
}
System.out.println();
// for loop
for (int i = 0; i < colors.size(); ++i) {
System.out.print(colors.get(i) + " ");
}
System.out.println();
// using iterator
Iterator<String> iterator = colors.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
// using listIterator
ListIterator<String> listIterator = colors.listIterator(colors.size());
while (listIterator.hasPrevious()) {
System.out.print(listIterator.previous() + " ");
}
System.out.println();
}
}
for-each 반복문으로 각각의 값을 순회해서 출력하는 것이 가능하다.
또한 get() 메소드로 각 인덱스의 값을 순차적으로 탐색하는 방법도 가능하다
그리고 iterator나 listIterator를 통해 값들을 순회하는 것도 가능하다.
listIterator의 경우 생성 시 ArrayList의 크기를 입력해주고 역방향으로 출력할 수 있가.
출력 결과
마지막의 경우 역순서로 출력이 되는 것을 확인할 수 있습니다.
5. 값 존재 유무 확인
ArrayList의 안에 값이 존재하는지 존재한다면 어느 위치에 존재하는지 알고 싶은 경우가 있다.
먼저 값이 존재하는지만 알고 싶은 경우 contains()를 사용한다.
값이 존재할 때 어느 위치에 존재하는지 알고 싶은 경우 indexOf()를 사용할 수 있다.
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> colors = new ArrayList<>(Arrays.asList("Black", "White", "Green", "Red"));
boolean contains = colors.contains("Black");
System.out.println(contains);
int index = colors.indexOf("Blue");
System.out.println(index);
index = colors.indexOf("Red");
System.out.println(index);
}
}
contains()는 값이 있는 경우 true를, 값이 없는 경우 false를 리턴한다.
indexOf()는 값이 존재하는 경우 해당 엘레멘트의 인덱스를 리턴한다.
값이 존재하지 않을 경우 -1을 리턴하기 때문에 별도로 처리가 가능하다.
'공부 STUDY > JAVA' 카테고리의 다른 글
[JAVA] 인터페이스(interface) (0) | 2023.01.10 |
---|---|
[JAVA] 다운캐스팅 (DownCasting) (0) | 2023.01.09 |
[JAVA] 상속 | 다형성(Polymorphism) (0) | 2023.01.08 |
[JAVA] 상속 | 메서드 오버라이딩 (0) | 2023.01.08 |
[JAVA] 상속 | 부모를 부르는 예약어, super (0) | 2023.01.08 |