본문 바로가기

JAVA

[JAVA/Collections Framework] ArrayList 예제로 보는 동작원리

예제를 보기 전 간단하게 ArrayList 정의를 한 번 보고 들어가자! 

 

ArrayList란?

자바의 List인터페이스를 상속받은 여러 클래스 중 하나로 가변 크기의 배열을 구현한 컬렉션 클래스이다.

List인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 갖는다.


ArrayList의 생성자와 메소드 

 

 

엄청 많다 삽입, 삭제 이런 중요한 것만 외워두고 필요할때 찾아보면 될듯.

쓰느라 애먹었다`ㅅ';;


이제 예제를 통해 알아보자!

[ArrayList 예제]

import java.util.ArrayList;
import java.util.Collections;

public class ArrayListEx1 {

	public static void main(String[] args) {
		// ArrayList 예제
		ArrayList list1 = new ArrayList(10);
		list1.add(new Integer(5));
		list1.add(new Integer(4));
		list1.add(new Integer(2));
		list1.add(new Integer(0));
		list1.add(new Integer(1));
		list1.add(new Integer(3));
		
		ArrayList list2 = new ArrayList(list1.subList(1, 4));
		print(list1, list2);
		
		Collections.sort(list1); //list1과 list2를 정렬한다.
		Collections.sort(list2); //Collections.sort(List l)
		print(list1, list2);
		
		System.out.println("list1.containsAll(list2): "+list1.containsAll(list2));
		
		list2.add("B");
		list2.add("C");
		list2.add(3,"A");
		print(list1, list2);

		list2.set(3,"AA");
		print(list1, list2);
		
		//list1에서 list2와 겹치는 부분만 남기고 나머지는 삭제한다.
		System.out.println("list1.retainAll(list2): "+list1.retainAll(list2));
		print(list1, list2);
		
		//list2에서 list1에 포함된 객체들을 삭제한다. 
		for(int i=list2.size()-1; i>=0; i--) {
			if(list1.contains(list2.get(i)))
				list2.remove(i);
		}
		print(list1, list2);
	}

	private static void print(ArrayList list1, ArrayList list2) {
		// TODO Auto-generated method stub
		System.out.println("list1 : "+list1);
		System.out.println("list2 : "+list2);
		System.out.println();
	}

}

 

[실행 결과]


이해가 안 될 수 있으니 부분부분 잘라서 설명하겠다.

 

크기가 10인 ArrayList를 만든다. 

그 다음 순서대로 list1 인덱스에 객체를 저장한다. 그러면 list1은 오른쪽과 같이 생성된다.

*인덱스는 0부터 시작한다. 

 

 

list2를 생성하는데, list1의 1부터 4사이에 저장된 객체를 반환 값으로 생성한다.

list1의 index1~3까지 값을 의미하여 4, 2, 0으로 list2가 생성된다.

*배열은 index이기 때문에 0부터 시작한다. 

 

 

 

list1과 list2를 출력하면 다음과 같이 출력된다.

 

 

sort는 ArrayList를 정렬하는 것으로 정렬하면 된다.

결과는 다음과 같이 출력된다.

 

 

출력 결과

list2가 list1에 포함되어 있는지 확인하는 것이다.

list1에 list2의 값인 0, 2, 4가 있어 true가 출력된다. (boolean형이므로 결과가 true로 출력된다.) 

 

 

list2에 "B"와 "C"의 값이 순차적으로 저장된다.

 

 

 list2.add(3,"A")의 의미는 인덱스 3번 위치에 "A"라는 객체를 저장하겠다는 의미이다.

하지만 이미 3번 인덱스 위치에는 B라는 값이 저장되어있다.

이때는 3번 인덱스에 "A"가 저장되고 "B"와"C"는 오른쪽으로 자동 쉬프트되어 값의 위치가 옮겨진다.

이 연산이 끝나면 오른쪽과 같은 배열이 된다. 

 

여기까지 출력하여 확인해보면 다음과 같이 list1, list2가 출력된다.

 

 

list2.set(3,"AA")은 인덱스 3번 위치에 "AA"라는 값을 저장하겠다는 의미이다.

이전에 저장되어있던 "A"의 값대신 새로운 값 "AA"가 저장된다.

 

 

출력하여 확인해보면 다음과 같이 list1, list2가 출력된다.

 

 

list1에서 list2에 겹치는 부분만 남기고 나머지는 삭제하라는 의미이다.

list1에서 0, 2, 4라는 값만 list2와 겹치기 때문에 1, 3, 5의 값은 삭제된다.

그리고 list2와 겹친 값이 있기때문에 true가 출력된다. (boolean형이므로 결과가 true로 출력된다.) 

 

 

출력 결과이다. true가 반환되고 다음과 같은 배열이 출력된다.

 

 

이 코드는 list의 공통 요소를 제거하기 위한 코드이다.

여러 개의 데이터를 제거할 경우 마지막 에서부터 제거해야 한다.(배열 복사 발생안함)

*처음부터 삭제할 경우 배열 복사가 발생한다.

for문으로 마지막에서 부터 순차적으로 공통 요소를 제거한다.

0, 2, 4의 값이 겹치기 때문에 list2에서 0, 2, 4의 값이 삭제된다. 

 

 

출력하여 확인해보면 최종적으로 다음과 같은 list1, list2가 출력된다.^_^

 

 

 

+ 손으로 그려보면서 공부하면 이해가 더 잘 되고 좋당`ㅅ'