본문 바로가기
Computer Science/Data Structure

[DataStructure/Kotlin] Kotlin에서 Array, List, MutableList, ArrayList의 차이 정리

by quessr 2025. 2. 13.

 

Kotlin에서는 Array, List, MutableList, ArrayList 등 다양한 컬렉션 타입을 사용할 수 있습니다.

이들은 모두 여러 개의 값을 저장하는 자료구조이지만, 동작 방식과 활용법이 서로 다릅니다.

이번 글에서는 각 자료구조의 특징과 차이점, 그리고 언제 어떤 것을 사용해야 하는지 정리하겠습니다.


1. Array vs List → 수정 가능 여부 차이

Array는 값 변경 가능하지만 크기 변경은 불가능

val arr = arrayOf(1, 2, 3)
arr[0] = 10  // 값 변경 가능
println(arr.joinToString())  // 10, 2, 3

// arr.add(4)  // 컴파일 오류 (크기 변경 불가능)
  • Array는 배열 크기가 고정되어 있지만, 인덱스를 통해 값 변경이 가능합니다.
  • 따라서, "값은 수정 가능하지만, 요소 추가/삭제는 불가능한" 구조입니다.

List는 수정이 불가능 (Immutable)

val list = listOf(1, 2, 3)
// list[0] = 10  // 컴파일 오류 (값 변경 불가능)
// list.add(4)  // 컴파일 오류 (요소 추가 불가능)
println(list)  // [1, 2, 3]
  • List는 읽기 전용(Immutable) 리스트이므로, 값 변경이나 추가/삭제가 불가능합니다.
  • 변하지 않는 데이터를 저장할 때 유용하며, 스레드 안전(Thread-Safe)한 특성이 있습니다.

2. Array vs ArrayList → 차이점과 활용법

Array vs ArrayList 비교

특징 Array ArrayList
크기 변경 불가능 가능
값 변경 가능 가능
추가/삭제 불가능 가능
내부 구조 고정된 배열 동적 배열 기반 리스트
Java 호환성 제한적 Java의 ArrayList와 호환

Array는 고정 크기, ArrayList는 동적 크기

val arr = arrayOf(1, 2, 3)
// arr.add(4)  // 에러 발생 (크기 변경 불가능)

val arrayList = arrayListOf(1, 2, 3)
arrayList.add(4)  // 요소 추가 가능
println(arrayList)  // [1, 2, 3, 4]
  • Array는 고정 크기이므로 요소 추가/삭제가 불가능하지만, ArrayList는 크기가 동적으로 변경됩니다.
  • ArrayList는 내부적으로 배열을 기반으로 하지만, 크기가 자동으로 조정되는 리스트 구조입니다.

3. MutableList vs ArrayList → 차이점과 유연성

MutableList는 여러 구현체를 지원 (다형성 활용)

fun modifyList(list: MutableList<Int>) {
    list.add(100)
    println(list)
}

// ArrayList로 MutableList 생성
val arrayList: MutableList<Int> = arrayListOf(1, 2, 3)
modifyList(arrayList)  // 실행 가능

// LinkedList로 MutableList 생성 (Java의 LinkedList 활용)
val linkedList: MutableList<Int> = java.util.LinkedList(listOf(1, 2, 3))
modifyList(linkedList)  // 실행 가능
  • MutableList를 사용하면 ArrayList, LinkedList, Vector 등 다양한 리스트 구현체로 변경할 수 있습니다.
  • 즉, MutableList는 인터페이스이므로, 리스트 구현체를 바꿀 가능성이 있을 때 유리합니다.

ArrayList는 특정 자료구조로 고정됨

fun modifyList(list: ArrayList<Int>) {
    list.add(100)
}

// ArrayList는 실행 가능
val arrayList = arrayListOf(1, 2, 3)
modifyList(arrayList)  // 실행 가능

// modifyList(mutableListOf(1, 2, 3))  // 실행 불가능 (MutableList는 ArrayList가 아닐 수도 있음)
  • modifyList 함수의 매개변수를 ArrayList<Int>로 선언하면, ArrayList가 아닌 다른 리스트 타입은 넣을 수 없습니다.
  • 즉, 함수의 인자로 사용할 때 MutableList를 쓰면 더 유연한 코드가 됩니다.

4. 결론: 언제 어떤 걸 써야 할까?

상황 추천 자료구조
고정 크기의 배열이 필요할 때 Array
값 변경 없이 읽기 전용 리스트가 필요할 때 List
크기가 변하면서 요소 추가/삭제가 필요한 경우 MutableList
Java 코드와 호환이 필요할 때 ArrayList
다형성을 활용하고 싶을 때 MutableList

 

반응형