Computer Science/Data Structure
리스트(List)
GKS
2022. 9. 21. 22:03
반응형
SMALL
리스트(List)
리스트란?
- 데이터를 순차적으로 저장하는 선형 자료구조
- 순서를 가진 항목들의 모임
- 배열이 가지고 있는 인덱스라는 장점을 버리고 빈틈없는 데이터 적재라는 새로운 장점을 취한 자료구조
- 중복된 데이터의 저장을 허용
- ArrayList, LinkedList 등 여러 인터페이스를 구현한 자료형
- 자바스크립트, 파이썬 같은 경우 리스트를 따로 구현하지 않고 배열에 List의 기능 중 일부를 제공
1. ArrayList
- 배열을 이용해서 리스트를 구현하는 것을 의미하는 자료구조이다.
장점
- index를 통한 검색이 용이하다.
- 연속적이므로 메모리 관리가 편하다.
- 내부적으로 배열을 이용하기 때문에 인덱스를 이용하여 접근하는 것이 빠르다.
단점
- 데이터의 추가, 삭제가 느리다.
- 정적이므로 배열의 크기를 컴파일 이전에 정해주어야 한다. -> 컴파일 이후에 변경할 수 없다.
- 크기가 고정되어 있기 때문에 엘리먼트가 삭제되면, 삭제된 상태를 빈 공간으로 남겨두어야 한다. -> 메모리 낭비
즉, 검색이 잦은 경우 ArrayList를 사용하는 것이 좋다.
생성
import java.util.ArrayList;
ArrayList<> list = new ArrayList<>();
추가
- 제네릭 타입을 선언한다면 해당 타입만 추가 가능
- 기본적으로 리스트의 맨 뒤에 데이터 추가
- 특정 인덱스를 선택해 해당 위치에 데이터 추가 기능
- 데이터를 추가하는 과정에서 내부적으로 사용하는 배열이 꽉 차면 기존 배열 대비 2배 큰 새로운 배열을 만들고 기존의 데이터를 새로운 배열로 복제
- 사용자는 ArrayList의 크기에 신경 쓰지 않고 편하게 프로그램을 만들 수 있다.
list.add(1234); // list라는 ArrayList 맨 뒤에 1234 라는 int 타입 데이터를 추가
list.add("hello, World"); // list라는 ArrayList 맨 뒤에 "hello, World" 라는 String 타입 데이터를 추가
list.add(1, 50); // 1이라는 인덱스에 50이라는 값을 추가
삭제
list.remove(2); // list의 3번째 데이터를 삭제 (항상 배열, 리스트의 인덱스는 0부터 시작)
가져오기
list.get(20); // 인덱스가 20인 데이터를 가져온다.
반복
- 자바에서는 ArrayList를 탐색하기 위한 방법으로 Iterator를 제공
- 객체지향 프로그래밍에서 사용하는 방법
- 먼저 Iterator 객체를 생성한다.
Iterator it = list.iterator(); // Iterator 객체는 list객체의 Iterator() 메소드를 통해 생성
while(it.hasNext()) { // 다음 엘리먼트가 존재하면 while문 반복
System.out.println(it.next());
if(it.next() = 1234) { // 다음 엘리먼트가 1234 라면
it.remove(); // 해당 엘리먼트 삭제
}
};
SMALL
ArrayList의 삽입, 삭제 과정

2. LinkedList
- 연결 리스트는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식의 자료구조이다.
- 순서가 있는 엘리먼트의 모임으로 배열과는 다르게 빈 엘리먼트는 절대 허용하지 않는다.
- 배열이 가지고 있는 인덱스라는 장점을 버리고 대신 빈틈없는 데이터의 적재라는 장점을 취한다.
- 리스트에서 인덱스는 몇 번째 데이터인가 정도의 의미를 가진다. -> 순서
장점
- 데이터의 추가, 삭제 시 주소만 서로 연결시켜 주면 되기 때문에 데이터의 추가, 삭제가 ArrayList보다 빠르고 용이하다.
- 메모리의 재사용이 편리하다.
- 불연속적이므로 메모리 관리가 용이하다.
- 동적이므로 크기가 정해져 있지 않다.
단점
- 순차 접근만 가능하다. 그래서 접근 속도가 느리다.
- 중간 노드가 끊어지면 그다음 노드를 찾기가 힘들다.
- 단순 LinkedList는 단방향성을 갖고 있어 인덱스를 이용해 자료를 검색하는 애플리케이션에 적합하지 않다.
- 메모리 이곳저곳에 산재해 저장되어 있는 노드들을 접근하는데 ArrayList보다는 긴 지연 시간이 소모된다.
- 참조자를 위해 추가적인 메모리를 할당해야 한다.
즉, 삽입, 삭제가 잦은 경우 LinkedList를 사용하는 것이 좋다.
생성
import java.util.LinkedList;
LinkedList<> list = new LinkedList<>();
삽입
list.addFirst(data); // 가장 앞에 데이터 추가
list.addLast(data); // 가장 뒤에 데이터 추가
list.add(data): // 가장 뒤에 데이터 추가
list.add(index, data); // index 뒤에 데이터 추가
list.set(index, changedata); // index의 데이터를 변경
삭제
list.removeFirst(); // 가장 앞의 데이터 제거
list.removeLast(); // 가장 뒤에 데이터 제거
list.remove(); // index 생략 시 0번째 index 제거
list.remove(index); // index의 데이터 제거
list.clear(); // 리스트 안의 모든 데이터 제거
검색
list.contains(data); // 리스트에 data가 있는지 검색, 있다면 true를 return
list.indexOf(data); // 리스트에 data가 있는 index 반환, 없으면 -1을 return
출력
int a = 0;
a = list.get(index); // index에 있는 data 출력
a = list.getFirst(); // 첫번째 데이터 출력
a = list.getLast(); // 마지막 데이터 출력
a = list.size(); // 리스트 사이즈 크기 출력
반응형
LinkedList의 삽입, 삭제 과정

반응형
LIST