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 |
반응형