프로그래밍안드로이드 개발자

코틀린의 컬렉션 작동 메커니즘을 설명하십시오: List, MutableList, Set, MutableSet, Map, MutableMap 간의 차이점. 사용할 때 발생할 수 있는 누락된 점은 무엇입니까? 코드 예제를 제시하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

코틀린은 두 가지 유형의 컬렉션을 제공합니다: immutable (변경 불가능한)mutable (변경 가능한).

  • List — 변경 불가능한 리스트. 요소를 추가하거나 제거할 수 없습니다.
  • MutableList — 변경 가능한 리스트: 요소를 추가하거나 제거할 수 있습니다.
  • Set — 변경 불가능한 집합 (유일한 요소).
  • MutableSet — 변경 가능한 집합.
  • Map — 연관 배열 (키-값), 변경 불가능함.
  • MutableMap — 변경 가능한 연관 배열.

코드 예제:

val fruits: List<String> = listOf("사과", "바나나", "체리") val mutableFruits: MutableList<String> = mutableListOf("사과", "바나나") mutableFruits.add("체리") val fruitSet: Set<String> = setOf("사과", "바나나") // 요소의 유일성 val mutableFruitSet: MutableSet<String> = mutableSetOf("사과", "바나나") mutableFruitSet.add("체리") val scores: Map<String, Int> = mapOf("톰" to 80, "제인" to 90) val mutableScores: MutableMap<String, Int> = mutableMapOf("톰" to 80) mutableScores["제인"] = 90

세부사항:

  • 기본적으로 컬렉션은 변경 불가능합니다.
  • 표준 라이브러리에서 목록을 반환하는 많은 함수는 List (아니면 MutableList)를 반환합니다.
  • 컬렉션을 작업할 때 변경할 수 없는 컬렉션을 변경하지 않는 것이 중요합니다.

속임수 질문.

List<T>를 매개변수로 받는 함수가 있다면, 함수 내부에서 이 리스트를 어떤 식으로든 변경할 수 있습니까?

답변: 아니요, 매개변수 유형이 List<T>인 경우 함수 내부에서 요소를 추가/제거할 수 없습니다. 그러나 실제로 MutableList<T>가 전달되는 경우, 이 유형으로 캐스팅할 수 있습니다 (위험이 따릅니다):

fun modifyList(list: List<String>) { if (list is MutableList) { list.add("다른 요소") // 원래 컬렉션이 변경 가능할 때 작동 } }

이런 방식은 권장되지 않습니다, 왜냐하면 계약을 위반하기 때문입니다 (List는 변경 불가능해야 함!).

이 주제의 세부 사항을 모르고 발생한 실제 오류의 예.


이야기

대규모 프로젝트에서 List<Customer>를 매개변수로 받는 함수를 사용하고, 함수 내부에서 새로운 요소를 추가하려고 시도했습니다. 컴파일 오류 (add/clear/remove는 List에 대해 정의되지 않음)는 리뷰 중에만 발견되었으며, 데이터 변환을 위해 변경 가능한 리스트가 필요했습니다.


이야기

컬렉션이 MutableList로 선언되었으나, 동기화 없이 여러 스레드에 전달되었습니다. 결과적으로 경쟁 조건으로 인해 "ConcurrentModificationException"이 발생하고 리스트 상태가 손상되었습니다. 오류를 찾는데 오랜 시간이 걸렸으며, 스레드 안전성을 간과했습니다.


이야기

데이터베이스에서 결과 집합을 작업하기 위해 하나의 서비스에서 mutableListOf를 사용하고 외부에 링크를 전달했습니다. 외부 코드가 실수로 리스트를 비웠습니다. 결과적으로 사용자에게 비어있는 데이터가 전달되었으며, 링크가 복사되지 않고 변경 가능한 컬렉션이 비즈니스 로직 층을 넘어 수정되었습니다.