List? ArrayList? LinkedList? 이것들은 뭘까?
List? -> 인터페이스(Interface)
Interface란? : 클래스 내 선언된 모든 메소드가 추상 메소드인 클래스를 의미한다.
이 Interface를 상속받는 클래스는 인터페이스에서 정의된 추상 메소드를 모두 구현해야 한다.
구현체로는 ArrayList, LinkedList, Stack, Vector가 있다. (Stack과 Vector는 추후에 다시 다루도록 하겠다.)
ArrayList? -> 클래스(Class)
컬렉션 프레임워크의 일부이다. (java.util 패키지에 존재)
ArrayList는 List 인터페이스를 구현하고 있다.
List가 제공하는 모든 기능들을 사용할 수 있으며, List 선언 시 구현 인스턴스의 자료형으로 쓰일 수도 있다.
- 중복 허용 & 순서 유지
- 인덱스로 원소들을 관리함 (배열과 상당히 유사하다. -> 기본적으로 배열을 사용하긴 하지만, 차이점이 존재한다.)
- 배열과 다르게 ArrayList는 값의 삽입/삭제가 가능하다. (클래스이기 때문에 해당 메소드들을 가지고 있음)
- 크기를 지정하지 않아도 되고, 값의 삽입/삭제가 동적으로 이루어진다.
단점
- 데이터 추가(크기 변경) 시 더 큰 용량의 새로운 임시 배열을 생성하여 데이터를 복사해야 함
- 배열의 크기를 충분히 큰 용량으로 설정해야 하는 상황엔 메모리 낭비를 피할 수 없다. ex) 중간에 크기 변경 피하려고
- 데이터의 삽입/삭제가 비순차적일 경우에 실행시간이 길어진다. (순차적일 경우 빠름)
- 중간에 데이터를 추가하거나 삭제하게 되면, 빈 공간 생성을 위해 데이터의 이동이 필요 & 빈 공간 채울 때도 마찬가지
LinkedList? -> 자료구조(Data Structure)
마찬가지로 컬렉션 프레임워크의 일부이다. (java.util 패키지에 존재)
배열의 단점을 보완하기 위해 만들어진 자료구조이다. (연결된 노드들의 집합이다.)
내부적으로 양방향 연결리스트로 이루어져 있고, 참조하려는 원소에 따라 순/역방향으로 순회가 가능하다.
- 모든 데이터가 ①데이터 부분, ②주소 부분(포인터)을 각각 가지고 있으며, 이는 한 세트이다. (배열은 연속된 위치죠?)
- 각각의 세트는 노드라고 불리고, 이는 서로 연결되어 있으며 포인터와 주소를 사용해 연결한다.
- 각 노드는 앞/뒤의 노드의 위치를 저장한다.
- 데이터의 삽입/삭제가 용이하며, ArrayList보다도 선호되는 자료구조이다. (주소값을 통해 이루어진다.)
- 공간의 제약이 존재하지 않고, 사용 후 기억 장소의 재사용이 가능하다. (연속적인 기억 장소의 할당이 불필요하다.)
단점
- 검색의 경우 ArrayList보다 느리다. -> 특정 자료의 탐색 시간이 많이 소요됨 (순차적 접근이기 때문이죠?)
- 포인터의 사용으로 인해 저장 공간의 낭비가 발생한다.
- 알고리즘이 복잡하다.
정리
- 데이터 조회는 ArrayList가 우위에 있고, 데이터의 삽입/삭제는 LinkedList가 우위에 있다.
- 정적인 데이터를 활용하면서 빈번한 조회가 발생? -> ArrayList 사용하는 것이 유리
- 동적으로 삽입/삭제의 요구사항이 빈번하게 발생? -> LinkedList 사용하는 것이 유리
매우 잘 정리된 내용이라 가져왔다.
(정리 어떻게 그렇게 깔끔하게 하시나요..)
자바에서 List를 생성하는 방법
- ArrayList <Object> list = new ArrayList <>();
- List <Object> list = new ArrayList <>();
차이점이 뭘까?
- 과일 <Object> list = new 사과<>();
- 사과 <Object> list = new 사과<>();
- 과일 타입으로 클래스를 생성하면 사과 클래스 뿐만 아니라,과일 인터페이스를 구현한 바나나, 키위 클래스 등에서도 사용가능하다.
- But, 사과 타입으로 클래스를 생성하면 바나나 또는 키위 클래스에서 사용이 불가능하다.
LinkedList는 생성 방법은 매우 비슷하지만, 상속의 차이가 있어 다음에 한 번 더 다루도록 하겠다. (Stack & Vector 도요.)
'Java' 카테고리의 다른 글
Split() (0) | 2023.07.21 |
---|---|
HashTable/HashMap - getOrDefault (0) | 2023.07.19 |
BufferedReader / StringTokenizer (0) | 2023.07.19 |