1. 코틀린 컬렉션의 이해
1.1 컬렉션이란?
- 코틀린의 컬렉션은 프로그램에서 여러 개의 데이터를 효율적으로 관리하고 처리하기 위한 자료구조입니다.
- 컬렉션은 동일한 타입(및 해당 타입의 하위 타입)의 객체들을 그룹으로 저장하고 처리할 수 있게 해줍니다.
노트
코틀린의 컬렉션은 Java나 Python 등 다른 언어의 컬렉션과 개념적으로 유사하지만, 불변(Immutable)과 가변(Mutable) 컬렉션을 명확히 구분한다는 특징이 있습니다.
1.2 코틀린 컬렉션의 주요 특징
- 코틀린의 컬렉션은 다음과 같은 주요 특징을 가집니다:
- 불변/가변 인터페이스 분리
- 타입 파라미터의 공변성(Covariance) 지원
- 풍부한 표준 라이브러리 함수 제공
- Null 안전성 보장
2. 컬렉션의 종류
2.1 List
- List는 순서가 있는 컬렉션으로, 동일한 요소의 중복을 허용합니다.
불변 List 사용 예시
val numbers = listOf("one", "two", "three", "four")
println("Number of elements: ${numbers.size}")
println("Third element: ${numbers[2]}")
println("Index of element \"two\": ${numbers.indexOf("two")}")
가변 List 사용 예시
val numbers = mutableListOf(1, 2, 3, 4)
numbers.add(5)
numbers.removeAt(1)
numbers[0] = 0
println(numbers)
팁
코틀린의 MutableList의 기본 구현체는 ArrayList입니다. ArrayList는 내부적으로 크기가 조절되는 배열을 사용하여 구현되어 있습니다.
2.2 Set
- Set은 중복을 허용하지 않는 컬렉션입니다.
- 요소의 순서는 일반적으로 중요하지 않습니다.
불변 Set 예시
val numbers = setOf(1, 2, 3, 4)
println("Number of elements: ${numbers.size}")
if (numbers.contains(1)) println("1 is in the set")
val numbersBackwards = setOf(4, 3, 2, 1)
println("The sets are equal: ${numbers == numbersBackwards}")
정보
LinkedHashSet은 요소의 삽입 순서를 보존하는 반면, HashSet은 순서를 보장하지 않지만 메모리를 더 효율적으로 사용합니다.
2.3 Map
- Map은 키-값 쌍을 저장하는 컬렉션입니다.
- 키는 고유해야 하지만, 값은 중복될 수 있습니다.
불변 Map 예시
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3)
println("All keys: ${numbersMap.keys}")
println("All values: ${numbersMap.values}")
println("Value by key 'key2': ${numbersMap["key2"]}")
가변 Map 예시
val numbersMap = mutableMapOf("one" to 1, "two" to 2)
numbersMap.put("three", 3)
numbersMap["one"] = 11
println(numbersMap)
2.4 ArrayDeque
ArrayDeque는 양방향 큐의 구현체로, 배열 기반의 자료구조입니다. 스택이나 큐로도 활용할 수 있습니다.
val deque = ArrayDeque(listOf(1, 2, 3))
deque.addFirst(0)
deque.addLast(4)
println(deque) // [0, 1, 2, 3, 4]
println(deque.first()) // 0
println(deque.last()) // 4
3. 컬렉션 선택 가이드
- 각 상황에 맞는 컬렉션 선택을 위한 가이드라인입니다:
- 순서가 중요하고 중복을 허용해야 할 때: List 사용
- 고유한 요소만 필요할 때: Set 사용
- 키-값 쌍으로 데이터를 관리해야 할 때: Map 사용
- 양쪽 끝에서의 빠른 삽입/삭제가 필요할 때: ArrayDeque 사용
경고
가변 컬렉션을 val로 선언해도 내부 요소는 변경할 수 있습니다. 하지만 참조 자체는 변경할 수 없으므로, 가능한 한 val을 사용하는 것이 안전합니다.
4. 마치며
- 코틀린의 컬렉션 시스템은 불변/가변 인터페이스의 명확한 구분과 풍부한 표준 라이브러리 함수를 통해 안전하고 효율적인 데이터 처리를 가능하게 합니다.
- 각 컬렉션 타입의 특성을 이해하고 적절히 활용하면, 더 견고하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.