본문 바로가기

Programming/JAVA

컬렉션 프레임워크(2) - List 컬렉션 2 : ArrayList

JAVA Logo image

 

앞서서 우리는 List라는 기본적인 컬렉션에 대해서 살펴보았습니다. 일렬로 늘어놓고, 객체를 인덱스 기반으로 관리한다고 했죠. 그리고 이는 하나의 인터페이스이기 때문에, 구현 클래스들이 존재하고 이 구현 클래스를 기반으로 사용하게 됩니다.

 

 

 

컬렉션 프레임워크(2) - List 컬렉션 1 : List의 개념

앞서서 살펴본 컬렉션 프레임워크의 기본 개념을 바탕으로, 하나씩 세부 사용법을 살펴보도록 하겠습니다. 우선 List 컬렉션에 대해서 먼저 살펴보겠습니다. 컬렉션 프레임워크(1) - 컬렉션 프레

nozeroslope.tistory.com

 

 

 

 


 

 

 

○ ArrayList

 

ArrayList는 List 인터페이스의 구현 클래스 중 하나로, 상당히 많이 사용되는 구현 클래스입니다. 일반적인 JAVA의 배열과 ArrayList의 가장 큰 공통점은 역시 인덱스로 객체를 관리한다는 점입니다. 하지만 ArrayList가 배열과 구별되는 가장 큰 차이점은 크기의 변동성입니다. JAVA에서의 배열은 생성 시점에 크기가 고정되고 변경이 불가능합니다. 하지만 ArrayList의 경우 기본 저장 용량(capacity)을 초과하는 객체가 할당되면 자동으로 저장 용량(capacity)이 늘어나게 됩니다.

 

ArrayList의 기본 생성 형태는 다음과 같습니다. 기본 용량(capacity)은 10개의 객체를 저장할 수 있도록 자동 할당 됩니다. 즉, 인덱스 0~9가 할당됩니다.

// E는 타입 파라미터. 객체 10개를 저장할 수 있는 초기 용량 할당됨
List<E> list = new ArrayList<E>();

// String 저장 예시
List<String> list = new ArrayList<String>();

 

기본 용량 10개에서 객체의 수가 늘어나면 용량은 자동으로 증가합니다. 하지만, 만약 처음 생성 시점부터 10개 이상의 용량을 갖도록 설정하고 싶다면 생성자의 파라미터를 이용합니다. 예를 들어 50개를 저장하는 용량을 설정하려면 아래와 같이 생성하면 됩니다. 여기에 스트링 객체 하나를 저장하고, 이를 불러오는 것까지 작성해 보겠습니다.

 

List<String> list = new ArrayList<String>(50);
list.add("스윙스");
String name = list.get(0);

 

ArrayList의 저장/삭제 규칙은 아래와 같습니다. 

· 객체를 추가하면 인덱스 0부터 차례대로 저장된다.
· 중간에 특정 인덱스를 삭제할 경우, 바로 뒤에 있는 객체들의 인덱스가 자동으로 1씩 앞당겨진다.
· 중간에 특정 인덱스를 추가할 경우, 해당 인덱스부터 마지막까지 1씩 밀려나게 된다.

 

만약 우리가 사용하려는 객체에 수시로 데이터가 추가/삭제되는 경우라면, ArrayList는 부적합합니다. 인덱스 넘버링이 지속적으로 변경되기 때문이지요. 이 경우에는 LinkedList를 사용하는 게 성능이 좋습니다. 

 

만일 데이터가 인덱스의 맨 끝에 저장되는 경우 혹은 인덱스 넘버를 검색해서 사용하는 경우에는 ArrayList의 성능이 훨씬 효율적입니다. 

 

 

 


 

 

사용 예시

 

import java.util.*;

public class ExampleMain {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		
		list.add("SWINGS");
		list.add("NOCHANG");
		list.add("DAMINI");
		list.add(2, "BlackNUT");
		list.add("GIRIBOY");
		
		int size = list.size();
		System.out.println("총 객체 수: " + size);
		System.out.println();
		
		String numb2 = list.get(2);
		System.out.println("2: " + numb2);
		System.out.println();
		
		for(int i = 0; i< list.size(); i++) {
			String str = list.get(i);
			System.out.println(i + ":" + str);
		}
		System.out.println();
		
		list.remove(2);
		list.remove(2);
		list.remove("GIRIBOY");
		
		for(int i = 0; i< list.size(); i++) {
			String str = list.get(i);
			System.out.println(i + ":" + str);
		}
		
	}
}

/* 출력
총 객체 수: 5

2: BlackNUT

0:SWINGS
1:NOCHANG
2:BlackNUT
3:DAMINI
4:GIRIBOY

0:SWINGS
1:NOCHANG
*/

 

 


 

 

일반적으로 ArrayList를 생성하고, 런타임 시점에 객체를 추가하는 것이 일반적이지만 생성 단계에서 객체를 고정 할당해 사용하는 방법도 있습니다. 이 경우 Arrays.asList(T...a) 메서드를 사용하게 되는데, 아래의 예시를 보시면 간단히 이해할 수 있습니다.

 

import java.util.*;

public class ExampleMain {
	public static void main(String[] args) {
	
		List<String> list1 = Arrays.asList("Swings", "Blacknut", "Jaypark");
		for(String name: list1) {
			System.out.println(name);
		}
		
		List<Integer> list2 = Arrays.asList(1, 100, 999);
		for(Integer number: list2) {
			System.out.println(number);
		}

	}
}

/* 출력
Swings
Blacknut
Jaypark
1
100
999
*/