본문 바로가기
자료구조

ArrayList와 LinkedList 비교 + 제네릭

by 코리늬 2018. 2. 5.


배열에서 자주 사용하는 ArrayList와 LinkedList가 헷갈려서 정리하려한다. 자바에서는 배열 사용시 초기 길이를 지정해야 하며 동적으로 배열의 길이를 변경할 수 없다.

먼저, ArrayList는 내부적으로 데이터를 배열에서 관리하며 추가, 삭제를 위해 임시 배열을 생성해 데이터를 복사한다.

따라서 대량의 자료를 추가, 삭제 하기 위해서는 데이터 복사가 많이 일어나 성능저하 우려가 있다. 

각 데이터는 인덱스를 가지고 있기 때문에 한번에 참조가 가능해 내가 해당 인덱스를 알고 있다면 검색에는 좋다.


LinkedList는 데이터를 저장하는 각 노드들이 링크로 앞뒤로 연결 되어있는 형태이다.

데이터 추가, 삭제시 노드의 연결을 끊고 원하는 부분에 추가, 삭제가 가능하기 때문에 유리하지만, 검색시에는 노드를 처음부터 순회해야 하기 때문에 검색에는 비효율적일 수 있다.

큐를 사용할때와 스택을 사용할 때의 약간 차이가 있다.

큐는 FIFO

offer(): Queue에 삽입

poll(): Queue에서 제거하며 읽기

peek(): Queue에서 제거하지 않고 읽기

스택은 LIFO

push(): Stack에 삽입

pop(): Stack에서 제거하며 읽기

peek(): Stack에서 제거하지 않고 읽기


ArrayList 사용법을 알아보면



LinkedList도 추가, 삭제하는 부분을 빼면 ArrayList와 사용방법은 동일하다.


* 추가로 궁금한 부분 : 왜 List객체 생성시 wrapper class를 사용하는가 ?

- 기본 자료형을 ArrayList에 사용하려면 wrapper 클래스를 적어줘야한다고 한다.

- JDK 1.4 이전에는 ArrayList list = new ArrayList(); 로 사용했는데

1.5부터는 ArrayList<Integer> list = new ArrayList<Integer>(); 이렇게 사용하고

1.7부터는 ArrayList<Integer> list = new ArrayList<>(); 이렇게 사용한다고 한다.

내가 포스팅에 사용한 방식은 1.5버전 방식이었다. 그래서 그냥 이렇게 써야하나보다 하고 쓰려한다.


<Integer>처럼 쓰는 방식을 제네릭이라고 한다.

제네릭은 다룰 객체를 미리 명시해 줌으로써 형변환을 사용하지 않아도 된다. 

제네릭을 사용함으로써 타입의 안정성을 제공하고 형변환을 하지않아 코드의 간결성이 보장된다.




'자료구조' 카테고리의 다른 글

  (0) 2018.07.17
자바 Set, HashSet, TreeSet, HashMap 정리  (0) 2018.07.16
순차탐색  (0) 2018.01.29
기수 정렬  (0) 2018.01.29
퀵 정렬  (0) 2018.01.29

댓글