뜌릅

ARRAY & ARRAYLIST & LINKEDLIST 본문

자료구조

ARRAY & ARRAYLIST & LINKEDLIST

TwoCastle9 2023. 9. 30. 23:44
반응형

특징

  • Array와 ArrayList는 LinkedList와 다르게 메모리가 연속적인 특징을 갖고있다.
  • Array와 ArrayList의 차이는 할당된 메모리의 크기가 가변적인지 아닌지의 차이를 갖고있다. Array는 고정된 메모리가 할당되고, ArrayList는 메모리를 동적으로 할당할 수 있다. 자바에서는 크기가 가득찰 경우, 1.5배 증가한다.
  • LinkedList는 단일, 다중 여러가지 종류가 존재한다. 한 노드에 연결될 노드의 포인터 위치를 가리키는 방식으로 되어있다.

장단점

위와 같은 자료구조적인 특징 때문에 장단점에서의 차이가 생기게 된다.

  1. Array: 배열은 선언할 때 크기와 데이터 타입을 지정해야 한다. 따라서 최대 사이즈를 알 수 없을때는 부적합하며, 중간에 데이터를 삽입하거나 삭제할 때도 매우 비효율적이다. 단 index을 통하여 random access가 가능하다. 추가적으로 space locality의 측면에서 Cache Hit Rate가 높아진다.
  2. ArrayList: ArrayList는 배열처럼 크기를 정해주지 않아도 된다. C++에서는 vector, Java에서는 list or ArrayList가 일반적이다. 이 녀석은 크기가 가변적이지만, 여전히 중간에 데이터 삽입 및 삭제에는 불리하다.
  3. LinkedList는 중간에 데이터 삽입 및 삭제는 전체를 돌지 않아도 빠르게 진행이 가능하다. 또 동적 크기도 가능하다 또한 Array와 다르게 메모리의 낭비도 없을것이다. 하지만, Search를 할때는 비효율적이다. 또한 포인터의 여분 공간이 노드마다 필요하고 Cache Hit Rate도 낮을 것이다.

코틀린에서의 인터페이스 & 구현체

대충 위와 같다. 종류가 매우 많지만, 하나씩 뜯어보겠다.

먼저 Array<Int> IntArray의 차이는 무엇일까?:

결론부터 말하자면 IntArray가 약간 좋다. 자바 사용자들을 위해 코드를 작성하자면, 아래와 같은 차이가 난다.

// 코틀린 코드
fun main() {
    val a = IntArray(5)
    val b = Array<Int>(5) { 0 }
}

// 위 코틀린 코드를 자바로 변환시
public static final void main() {
  int[] a = new int[5];
  Integer[] b = new Integer[5];
}

Int와 Integer의 차이는 Boxing과 Unboxing이다. int는 Premitive이고 Integer은 Int의 Wrapper 클래스이다. int에서 Integer로 변환은 Boxing과정이라고 한다. 반대의 과정은 Integer.valueOf()을 호출해서 진행된다. 즉 호출 비용이 발생한다. 또 초기화에서의 차이도 존재하는데, 이 때문에 IntArray을 애용하는게 좋다.

list와 mutableList의 차이:

Read-Only인지 아닌지의 차이이다.

mutableList와 ArrayList의 차이는 무엇일까?:

둘다 동일하다고 하다. 다만 후에 갈라질수 있어서 표기명의 차이가 있다고 한다.

반응형