면접 질문 목록으로 가기
면접 질문실전 질문꼬리 질문

코틀린 컬렉션 타입

skydovesJaewoong Eum (skydoves)||7분 소요

코틀린 컬렉션 타입

코틀린은 요소의 그룹을 관리하기 위한 체계적인 컬렉션(collection) 타입을 제공합니다. 컬렉션은 크게 두 가지 범주로 나뉩니다. 접근 연산만 노출하는 읽기 전용(read-only) 컬렉션과 수정을 허용하는 가변(mutable) 컬렉션입니다. 이러한 구분은 별도의 인터페이스를 통해 타입 시스템 수준에서 강제되며, 개발자가 의도를 명확하게 표현하고 의도하지 않은 수정을 방지하는 데 도움이 됩니다. 컬렉션 계층 구조, 가변성(mutability) 의미론, 그리고 읽기 전용 뷰(view)와 진정한 불변성(immutability)의 차이를 이해하는 것은 실제 면접에서도 자주 다루어지는 주제입니다. 특히 Jetpack Compose와 함께 사용할 때 이 구분이 실질적으로 중요해지므로, 단순히 "읽기 전용이면 불변 아닌가요?"라는 오해를 넘어서 정확하게 설명할 수 있어야 합니다.

이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • 코틀린의 세 가지 주요 컬렉션 타입인 List, Set, Map의 특성과 차이를 설명할 수 있습니다.
  • 읽기 전용 컬렉션 인터페이스와 가변 컬렉션 인터페이스의 차이를 이해할 수 있습니다.
  • 읽기 전용 컬렉션이 진정한 불변성을 보장하지 않는 이유를 파악할 수 있습니다.
  • kotlinx.collections.immutable 라이브러리를 활용하여 진정한 불변 컬렉션을 적용하는 방법을 익힐 수 있습니다.

읽기 전용 컬렉션 타입

코틀린의 읽기 전용 컬렉션 인터페이스는 수정 연산을 노출하지 않고 요소에 대한 접근만 제공합니다. 주요 타입은 다음 세 가지입니다.

**List**는 인덱스를 통해 요소에 접근하는 순서가 있는(ordered) 컬렉션입니다. 삽입 순서를 보존하며 중복 요소를 허용합니다.

val languages = listOf("Kotlin", "Java", "Kotlin")
println(languages[0])    // 출력: Kotlin
println(languages.size)  // 출력: 3

**Set**는 고유한 요소만 저장하는 컬렉션입니다. 중복을 허용하지 않으며, 기본 구현체인 LinkedHashSet은 삽입 순서를 보존합니다.

val unique = setOf("Kotlin", "Java", "Kotlin")
println(unique)       // 출력: [Kotlin, Java]
println(unique.size)  // 출력: 2

**Map**은 키-값 쌍(key-value pair)으로 이루어진 컬렉션이며, 각 키는 고유합니다. 기본 구현체인 LinkedHashMap을 사용하므로 키를 통한 조회가 상수 시간(O(1))에 이루어집니다.

val config = mapOf("language" to "Kotlin", "platform" to "Android")
println(config["language"])  // 출력: Kotlin

이 세 가지 타입은 List<T>, Set<T>, Map<K, V> 인터페이스를 통해 선언되며, add(), remove(), put()과 같은 수정 메서드를 포함하지 않습니다. 따라서 해당 인터페이스 참조를 통해서는 컬렉션의 내용을 변경할 수 없습니다.

가변 컬렉션 타입

가변 컬렉션은 읽기 전용 인터페이스를 확장하여 수정 연산을 추가합니다. MutableListList를, MutableSetSet을, MutableMapMap을 각각 확장합니다.

val names = mutableListOf("Alice", "Bob")
names.add("Charlie")
names.removeAt(0)
println(names) // 출력: [Bob, Charlie]

val tags = mutableSetOf("android", "kotlin")
tags.add("compose")
println(tags) // 출력: [android, kotlin, compose]

val settings = mutableMapOf("theme" to "dark")
settings["language"] = "en"
println(settings) // 출력: {theme=dark, language=en}

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기
면접 질문 목록으로 가기