※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
[ 1 ] List Interface
List Interface란 선형 자료구조로서 순서가 있는 데이터를 저장하기 위해 만들어진 인터페이스이다. 보통 같은 종류의 데이터를 저장할 때 int[] arr = new int[10] 와 같은 '배열'을 활용하지만, 이처럼 선언한 배열은 10개의 데이터만 저장할 수 있다. 만약 할당된 범위를 넘어설 경우 IndexOutofBoundsException 에러가 발생한다.
List interface 는 '동적 크기'를 가지므로 배열의 단점을 보완할 수 있고, '중복을 허용'하고 '저장순서가 유지'된다는 특징도 있다.
List interface 의 대표적인 메소드는 다음과 같다.
메소드 | 설명 |
boolean add(Object o) | List에 요소를 추가한다. |
boolean remove(Object o) | 지정한 객체와 같은 첫 번째 객체를 삭제한다. |
boolean contains(Object o) | 지정한 객체가 List에 있는지 확인한다. 있다면 true, 없다면 false를 반환한다. |
int size() | 현재 List에 있는 요소 개수를 반환한다. |
Object get(int index) | 지정한 인덱스에 저장된 요소를 반환한다. |
Object set(int index, Object e) | 지정한 인덱스에 있는 요소를 지정된 요소로 바꾼다. |
boolean isEmpty() | 현재 List에 요소가 없다면 true, 있다면 false를 반환 |
int indexOf(Object o) | 지정된 객체가 있는 첫 번째 요소의 위치를 반환한다. 없다면 -1을 반환한다. |
void clear() | 모든 요소들을 제거한다. |
[ 2 ] 구조
List Interface의 상속 구조는 다음과 같다.
[ 2 - 1 ] ArrayList
- Object[] 배열을 사용하기 때문에 흔히 사용하는 배열(int[])과 유사한 형태이다.
- 그러므로 인덱스를 활용한 리스트 요소 접근에는 좋은 성능을 보인다.
- 하지만, 배열의 중간에 요소를 삽입-삭제할 경우 그 뒤의 모든 요소들을 뒤로 오른쪽으로 밀거나 왼쪽으로 당겨야 하기 때문에 삽입-삭제에서는 비효율적이다.
- 리스트에 요소를 추가할 공간이 부족하면 더 큰 배열을 생성해 기존의 내용을 복사하는 과정을 거친다.
[ 2 - 2 ] LinkedList
- 배열의 중간에 요소를 삽입-삭제할 때의 비효율성, 공간 부족할 때 더 큰 배열을 생성해야 하는 비효율성을 해결하기 위해 LinkedList를 고안했다.
- LinkedList는 데이터와 주소로 이루어진 클래스(Node)를 만들어 서로 연결하는 방식으로 리스트를 생성한다.
- 그러므로 특정 요소를 삽입-삭제할 때 해당 요소의 Node를 다른 Node와 연결하거나 끊기만 하면 되므로 ArrayList 보다 효율적이다.
- 하지만, 특정 요소를 검색할 경우 리스트의 첫 Node부터 찾으려는 Node가 나올 때까지 연결된 Node를 모두 방문해야 하므로 비효율적이다.
- Queue인터페이스와 Deque인터페이스를 구현한다.
[ 2 - 3 ] Vector
- JCF가 도입되기 전부터 Java가 지원하던 클래스이다.
- Object[] 배열을 사용하므로 ArrayList 와 유사하다.
- 여러 쓰레드가 동시에 데이터에 접근할 경우 순차적으로 이를 처리하는 '동기화'를 지원한다. 그러므로 멀티 쓰레드에서 안전하지만, 단일 쓰레드에서도 동기화를 하기 때문에 ArrayList에 비해 성능이 좋지 않다.
객체 생성 방법은 다음과 같다.
// 방법 1
ArrayList<T> al = new ArrayList<T>();
LinkedList<T> ll = new LinkedList<T>();
Vector<T> vc = new Vector<T>();
// 방법 2
List<T> al = new ArrayList<T>();
List<T> ll = new LinkedList<T>();
List<T> vc = new Vector<T>();
다형성으로 인해 방법 2도 가능하다. 만약 List의 종류를 중간에 바꿔야 한다면 List<T>로 선언하자.
[ 참고자료 ]
https://catsbi.oopy.io/8f0f5192-3a06-405e-8076-dbc5ff9f2dfb
컬렉션 프레임워크
목차
catsbi.oopy.io
https://st-lab.tistory.com/142
자바 [JAVA] - 자바 컬렉션 프레임워크 (Java Collections Framework)
아마 프로그래밍을 전공한다면 '자료구조'라는 단어를 들어본 적이 있을 것이다. 자료구조는 Data Structure라고 하는데, 직역하면 데이터 구조. 좀 더 자세하게 설명하자면 '일련의 일정 타입들의
st-lab.tistory.com
'Programming > Java' 카테고리의 다른 글
[Java] 클래스, 객체, 인스턴스의 차이 및 객체 배열 (0) | 2023.02.17 |
---|---|
[Java] JVM, Java 환경변수 설정(Mac, 기본 zsh 쉘) (5) | 2023.01.18 |
[Java] 컬렉션 프레임워크 (1) | 2022.10.03 |
[Java] length, length(), size() 차이 (1) | 2022.10.02 |
[Java] Enum 클래스 (1) | 2022.08.29 |