사실 List의 특징은 앞에서 모두 이야기했다.
여기서는 List 메소드를 익숙한 Array와 비교해서 알아보자.
- Array
우리가 익숙한 기본형 데이터를 다루기 때문에 편하다고 느낄 것이다.
하지만 사실 삽입 삭제 메소드를 제공하지 않고 관리가 어렵다.
(배열의 크기는 고정되어 있기때문)
- List
생소한 클래스형 데이터를 다루기에 불편하지만,
삽입/조회/삭제 메서드를 제공한다.
또한 배열 요소가 객체이므로, 관리 또한 편리하다.
이를 그림으로 비교하면 다음과 같다.
List 인터페이스의 대표 주자로써, 많이 사용하는 자료구조이다.
설명할 것은 별로 없고, 메서드에 대해 알아보자.
List<User> userList = new ArrayList<>();
userList.add("가");
userList.add("나");
// 인덱스를 지정하여 삽입 가능
userList.add(1, "다");
add() 메서드로 삽입하며, 특정 인덱스에 삽입도 가능하다.
List<User> userList = new ArrayList<>();
// 첫번째 요소("다")를 삭제
userList.remove(1);
// 그 다음 첫번째 요소("나")를 삭제
userList.remove(1);
특정 인덱스를 삭제하면, 그 다음 요소가 빈자리를 채운다.
이처럼 가변적이므로, 메모리 관리가 효율적이다.
/@@ get() 메서드는 앞서 설명했으므로 생략하겠다 @@/
add() 메소드가 엄청 편해보이지만, 조건없이 그냥 삽입이 가능할리가 없다.
이렇게 가변적으로 보이는 이유는 "배열을 새로 만들기 때문"이다.
사이즈를 초과하여 삽입을 하면 List는 다음 과정을 거친다.
- 초과한 사이즈 만큼의 List 배열을 새로 만든다.
- 새로 생성된 배열에 값을 복사한다.
- 기존의 배열은 폐기된다.
이런 복잡한 과정이 add() 한번에 이뤄지는 것이다!
따라서 사이즈를 초과하는 add()는 많은 시간과 비용이 걸린다.
Vector와 ArrayList는 동기화의 유무로 나뉜다고 하였다.
그럼 Vector는 동기화가 된다는 건데, 동기화란 뭘까?
- 동기화란?
데이터의 ACID중 C, 즉 일관성(Consistency)에 해당하는 것으로, 데이터의 동시 접근을 처리해주는 작업이다.
다시말해, 멀티 스레드 환경에 최적화된 List라는 것이다.
나머지는 ArrayList와 동일하므로 생략한다.
2편에 이어서.. -->>