Java

List와 ArrayList, LinkedList

bittersweet 2023. 7. 22. 04:23
반응형

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 사용하는 것이 유리

 

 

출처 : https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-ArrayList-vs-LinkedList-%ED%8A%B9%EC%A7%95-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90

 

 

 

매우 잘 정리된 내용이라 가져왔다.

(정리 어떻게 그렇게 깔끔하게 하시나요..)

 

 

 

 

 

 

 

 

자바에서 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