상세 컨텐츠

본문 제목

[JAVA]Collection(컬렉션)의 자료구조 정리 _Part01.ArrayList

Language/JAVA

by Computer_x86_64 2021. 8. 10. 17:13

본문

프로그램에는 자료를 효율적으로 처리하기 위한 자료구조들이 있으며 

개발자가 만들수도있지만, 이미 만들어져 가져다 사용할수 있는 것도 있어요.

C++에는 std

JAVA에는 Collection interface가 그것입니다.

 

 

List와 Set은 Collection Interface에 상속된 자손 interface이고

별도로 Map 존재합니다.

public interface List<E> extends Collection<E> {
...
}

public interface Set<E> extends Collection<E> {
...
}
public interface Map<K, V> { 
...
}

 

크게 3개의 List, Set, Map 으로 나뉘고

List : 배열과 비슷하나 입력에 대한 Size의 대한 불편함이 없습니다. (데이터 중복 O,  순서 O)

Set : Set은 집합이다. 수학에서 집합은 A집합에 같은 값은 존재할수 없습니다.(데이터 중복 X, 순서 X)
       (Set은 정렬불가해 list로 만들어 정렬해야 합니다.)

Map : Key, value사물함속 키와 사물함내용물이라고 생각하면 좋을것 같습니다. (데이터 중복 : Key X , Value O) , 순서 X) 사물함키는 유일해야하고 사물함 내용물은 중복이되도 됩니다...

 

이 외에도 매우 많은 자료구조가 있으며 지금 설명하는 것은 Collection에 한해서 설명하겠습니다.

 

리스트부터 설명하기 전에 Array(배열)을 간단하게 설명하겠습니다.

배열은 생성시 무조건 사이즈를 정해야합니다.

정해진 사이즈는 확장하기 위해서는 새로운 배열을 만들어 copy해야합니다.

 

List
- ArrayList : 동기화를 지원하지 않음. (동기화 지원 필요시 Vector사용.)

사이즈에 제한이 없으며 입력하고 삭제에 자유롭습니다.

단 삭제시 주의야하는 것이 

중간에 데이터를 삽입하거나 삭제시 이다.

ArrayList는 중간데이터를 삭제시 IntList1.remove(2)  --여기서 2는 인덱스이다.

인덱스 3에 있는 4가 인덱스 2에 복사되고 3인덱스의 값인 4는 null로 바뀐다.

서술보다 쉽게 동작방식을 순차적으로 설명드리겠습니다.

 

1. IntList1.remove(2) 시 인덱스2 의 값 3이 삭제합니다.

 

2. 인덱스 3에 있는 값 4가 인덱스 2에 복사됩니다.

 

3. 인덱스 3에 있는 값은 null로 초기화됩니다.

 

지금은 아주 작은 리스트 편집이지만 

List의 사이즈가 100, 1000, 100000..

이라고했을때 중간에 데이터삭제시 엄청난 오버헤드가 발생합니다.

위와 같은 성질을 잘 기억하고 아래 코드를 보셔야합니다. (특정 위치 삭제시 그 바로 인접(왼쪽에서 부터 데이터가 복사가 이뤄진다.)

 

package _09_Collection.List;

import java.util.ArrayList;

public class test {
	public static void main(String[] args) {
		
		ArrayList<Integer> IntList = new ArrayList<>();
		IntList.add(1);
		IntList.add(2);
		IntList.add(3);
		IntList.add(4);
		IntList.add(5);
		IntList.add(6);
		IntList.add(7);
		IntList.add(8);
		IntList.add(9);
		IntList.add(10);
		System.out.println(IntList);
		
		for(int i=0; i<IntList.size(); i++) {
			IntList.remove(i);
		}
		System.out.println(IntList);

	}

}

결과 : 

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 6, 8, 10]

 

ArrayList에 있는 데이터가 다 삭제되지 않았습니다.

잘생각해보면 for문을 통해 i는 증가합니다. 

Debug를 통한 i와 IntList.size()값입니다.

1회차

 

2회차

 

3회차

전체 사이즈는 줄어들면서

 

i값은 증가


(IntList.size() 10 : > 9 > 8 ...

i 0 > 1 > 2 > 3...

이러다 보면 중간에 만나는 숫자가 발생하게 된다.)

하고 있어 

삭제가 되지 않는겁니다.

전체 삭제를 원한다면 이와 같이 하거나

		for(int i=IntList.size()-1; i >= 0; i--) {
			IntList.remove(i);
		}
        //반복의 대상을 ArrayList 사이즈로하고 
		//기준을 i는 0보다 크거나 같다면  i의 사이즈는 줄어들게 설정합니다.

removeAll()메서드로 삭제하는게 더 편하다.

 

관련글 더보기

댓글 영역