컬렉션 프레임워크
컬렉션 프레임워크는 배열처럼 다수의 데이터를 한 묶음으로 보관, 처리할 수 있는 구조를 의미합니다. 배열보다 많은 기능을 가지고 있어 자주 사용됩니다.
jdk1.2에 등장했으며 자바는 컬렉션 프레임워크를 위한 다양한 인터페이스와 클래스들을 제공하고 있습니다. 인터페이스와 클래스들은 java.util 패키지에 포함되어 있으며 핵심 인터페이스는 List, Set, Map입니다. 사용하려면 해당 클래스를 import 해주어야 합니다.
컬렉션 프레임워크의 큰 틀은 모두 인터페이스로 설계되어 있고 이를 구현한 클래스들을 인스턴스화해 사용합니다. 각 인터페이스와 클래스들의 주요 메서드 위주로 알아봅시다.
컬렉션 인터페이스의 구조도
인터페이스 | 특징 |
List / MutableList |
순서가 있는 데이터의 집합으로 순서로 구분이 가능하기 때문에 데이터의 중복을 허용합니다. |
Set / MutableSet |
순서가 없는 데이터의 집합으로 List와 달리 데이터의 중복을 허용하지 않습니다. |
Map / MutableMap |
키(key)와 값(vallue)의 쌍(pair)으로 이루어진 데이터의 집합입니다. 순서가 없으며 키의 중복을 허용하지 않고, 키로 구분이 가능하기 때문에 값의 중복을 허용합니다. |
코틀린의 컬렉션은 자바와 달리 가변형과 불변형으로 나누어져 있습니다. 가변형은 Mutable이 붙은 인터페이스를 구현하여 생성합니다. 불변형에서 가변형으로 형변환하려면 toMutable컬렉션종류() 메서드를 사용하면 됩니다.
배열과의 차이점
컬렉션 프레임워크는 배열보다 많은 기능들을 담고 있습니다. 그렇기에 배열보다 속도가 느려지는 단점이 있습니다. 배열(Array)은 생성 시 크기 지정이 필수이며 지정된 경우 변경이 불가능하지만, 컬렉션 프레임워크의 구조들은 용량과 크기를 유동적으로 조절할 수 있습니다.
용량(capacity) : 데이터가 들어갈 수 있는 크기
크기(size) : 실제로 데이터가 들어간 개수
Iterable, MutableIterable 인터페이스
지난 글에서 언급되었던 iterator 기억하시나요? 배열 요소에 순차적으로 접근할 때 사용했었는데요. 컬렉션 요소에도 접근이 가능합니다. iterable 인페이스에 iterator() 메서드가 선언되어 있습니다.
리턴타입 | 메서드명 | 설명 |
Iterator<E> | iterator() | 컬렉션의 iterator 반환 |
Collection, MutableCollection 인터페이스
List와 Set, MutableCollection 인터페이스가 Collection을 상속받으며 Map 인터페이스는 포함되지 않습니다.
Collection의 멤버
MutableCollection의 멤버
List, MutableList 인터페이스
List는 순서가 있는 데이터의 집합으로 순서로 구분이 가능하기 때문에 데이터의 중복을 허용합니다.
생성자
불변형 | 가변형 |
List(사이즈, init람다식) | MutableList(사이즈, init람다식) |
컬렉션을 생성하는 헬퍼함수
불변형 | 가변형 |
listOf(...) : 기본 불변형 List emptyList<형식 매개변수>(...) : 비어있는 List listOfNotNull(...) : null을 허용하지 않는 List (null을 넣어도 포함되지 않습니다.) |
mutableListOf() : 기본 가변형 List arrayListOf() : 자바의 ArrayList |
List의 멤버
MutableList의 멤버
Set, MutableSet 인터페이스
Set은 순서가 없는 데이터의 집합으로 List와 달리 데이터의 중복을 허용하지 않습니다.
컬렉션을 생성하는 헬퍼함수
불변형 | 가변형 |
setOf() : 기본 불변형 Set |
mutableSetOf() : 기본 가변형 Set hashSetOf() : 자바의 HashSet linkedSetOf() : 자바의 LinkedHashSet sortedSetOf() : 자바의 TreeSet |
Set의 멤버
MutableSet의 멤버
Map, MutableMap 인터페이스
Map은 키(key)와 값(vallue)의 쌍(pair)으로 이루어진 데이터의 집합입니다. 순서가 없으며 키의 중복을 허용하지 않고, 키로 구분이 가능하기 때문에 값의 중복을 허용합니다.
컬렉션을 생성하는 헬퍼함수
불변형 | 가변형 |
mapOf() : 기본 불변형 Map | mutableMapOf() : 기본 가변형 Map hashMapOf() : 자바의 HashMap linkedMapOf() : 자바의 LinkedHashMap sortedMapOf() : 자바의 SortedMap |
Map의 멤버
MutableMap의 멤버
컬렉션의 확장 함수
연산
함수 | 설명 |
연산자 +, - | 컬렉션에 요소를 추가, 제거하거나 컬렉션끼리 병합할 수 있음 |
plus() | + 연산자와 동일한 기능 |
union() | 컬렉션끼리 병합, 병합 시 중복 요소는 한 개만 유지 |
❗ map은 Pair()를 사용해 요소를 추가, 제거할 수 있습니다. Pair()는 두 값을 한 쌍으로 묶는 메서드입니다.
처리
함수 | 설명 |
forEach() | 컬렉션을 순환하며 접근한 요소를 람다식으로 처리함 |
forEachIndexed() | 컬렉션을 순환하며 접근한 요소와 인덱스를 람다식으로 처리함 |
onEach() | 컬렉션을 순환하며 접근한 요소를 람다식으로 처리한 후 컬렉션으로 반환 |
집계
함수 | 설명 |
count() | 조건에 맞는 요소의 개수를 반환 |
min(), max() | 최솟값과 최댓값을 반환 |
minBy(), maxBy() | 식의 최대, 최솟값을 반환 |
minByOrNull(), maxByOrNull() | 특정 조건에 따라 최소값 또는 최대값을 반환, 해당 요소가 없으면 null을 반환 |
sum() | 요소의 합을 계산 (숫자 컬렉션 한정) |
sumOf() | 요소에 대해 특정 기준으로 합계를 계산 |
average() | 요소의 평균을 계산 (숫자 컬렉션 한정) |
함수 | 설명 |
fold() | 초깃값과 정해진 식을 컬렉션의 앞부분부터 모든 요소에 적용해 결과값을 반환 |
foldRight() | 초깃값과 정해진 식을 컬렉션의 뒷부분부터 모든 요소에 적용해 결과값을 반환 |
foldIndexed() | 초깃값과 정해진 식을 컬렉션의 앞부분부터 모든 요소에 적용해 결과값을 반환 식에서 인덱스를 사용할 수 있음 |
reduce() | 정해진 식을 컬렉션의 앞부분부터 모든 요소에 적용해 결과값을 반환 |
reduceRight() | 정해진 식을 컬렉션의 뒷부분부터 모든 요소에 적용해 결과값을 반환 |
reduceIndexed() | 정해진 식을 컬렉션의 뒷부분부터 모든 요소에 적용해 결과값을 반환 식에서 인덱스를 사용할 수 있음 |
검사
함수 | 설명 |
all() | 모든 요소가 식에 부합하는지 확인 |
any() | 하나 이상의 요소가 식에 부합하는지 확인 |
contains() | 요소를 포함하는지 확인 |
containsAll() | 모든 요소를 포함하는지 확인 |
none() | 조건에 맞는 요소가 없는지 확인 |
isEmpty() | 컬렉션이 비어 있는지 확인 |
isNotEmpty() | 컬렉션이 비어 있지 않은지 확인 |
필터
함수 | 설명 |
filter() | 식에 부합하는 요소들만 추출하여 리스트로 반환 |
filterNot() | 식에 부합하지 않는 요소들만 추출하여 리스트로 반환 |
filterNotNull() | null을 제외한 요소들만 추출하여 리스트로 반환 |
filterIndexed() | 식에 부합하는 요소들만 추출하여 리스트로 반환 식에서 인덱스를 사용할 수 있음 |
filterIndexedTo() | 식에 부합하는 요소들만 추출하여 컬렉션으로 반환 식에서 인덱스를 사용할 수 있음 |
filterKeys() | map의 키에 따라 추출하여 map으로 반환 |
filterValues() | map의 값에 따라 추출하여 map으로 반환 |
filterIsInstance<>() | 특정 자료형을 추출하여 리스트로 반환 |
distinct() | 중복요소를 한 요소로 취급하여 리스트로 반환 |
intersect() | 다른 컬렉션과 겹치는 요소들만 골라 리스트로 반환 |
고르기
함수 | 설명 |
componentN() | N번째 요소를 반환 |
getOrElse() | 인덱스 N의 요소 반환, 만약 인덱스를 벗어난다면 기본값 반환 |
elementAt() | 인덱스 N의 요소 반환 |
elementAtOrElse() | 인덱스 N의 요소 반환, 만약 인덱스를 벗어난다면 식의 결괏값 반환 |
elementAtOrNull() | 인덱스 N의 요소 반환, 만약 인덱스를 벗어난다면 null 반환 |
first() | 식에 부합하는 첫 번째 요소 반환 |
last() | 식에 부합하는 마지막 요소 반환 |
firstOrNull() | 식에 부합하는 첫 번째 요소 반환, 없다면 null 반환 |
lastOrNull() | 식에 부합하는 마지막 요소 반환, 없다면 null 반환 |
find() | 식에 부합하는 첫 번째 요소 반환 |
indexOf() | 요소에 일치하는 첫 번째 인덱스 반환, 없으면 -1 반환 |
indexOfFirst() | 람다식에 일치하는 첫 번째 인덱스 반환, 없으면 -1 반환 |
lastIndexOf() | 요소에 일치하는 마지막 인덱스 반환, 없으면 -1 반환 |
indexOfLast() | 람다식에 일치하는 마지막 인덱스 반환, 없으면 -1 반환 |
single() | 람다식에 일치하는 요소가 하나뿐일 때 그 값을 반환, 요소가 없거나 여러개라면 예외 발생 |
singleOrNull() | 람다식에 일치하는 요소가 하나뿐일 때 그 값을 반환, 요소가 없거나 여러개라면 null 반환 |
자르기
함수 | 설명 |
take() | 앞 요소 n개를 리스트로 반환 |
takeLast() | 뒤 요소 n개를 리스트로 반환 |
takeWhile() | 조건식에 부합할 때까지만 앞에서부터의 요소를 리스트로 반환 |
takeLastWhile() | 조건식에 부합할 때까지만 뒤에서부터의 요소를 리스트로 반환 |
drop() | 앞 요소 n개를 제외하고 리스트로 반환 |
dropLast() | 뒤 요소 n개를 제외하고 리스트로 반환 |
dropwhile() | 조건식에 부합할 때까지만 앞에서부터의 요소를 제외하고 리스트로 반환 |
dropLastWhile() | 조건식에 부합할 때까지만 뒤에서부터의 요소를 제외하고 리스트로 반환 |
slice() | 특정 범위의 인덱스를 가진 리스트를 인자로 하여 특정 범위 인덱스의 요소들만 잘라 리스트로 반환 |
변형
함수 | 설명 |
map() | 모든 요소에 식을 적용해 새로운 컬렉션을 반환 |
mapIndexed() | 모든 요소에 식을 적용해 새로운 컬렉션을 반환 식에서 인덱스를 사용할 수 있음 |
mapNotNull() | null을 제외하고 식을 적용해 새로운 컬렉션을 반환 |
flatMap() | 모든 요소에 식을 적용해 새로운 컬렉션을 반환 만약 결과값이 중첩 컬렉션이 된다면 내부 컬렉션 요소들을 합쳐 1차원 컬렉션으로 반환 |
groupBy() | 주어진 식에 따라 요소를 그룹화 한 뒤 map으로 반환 |
partition() | 주어진 식에 따라 요소를 두 개로 나눈 후 pair로 반환 |
zip() | 두개의 컬렉션을 동일한 인덱스끼리 묶어 pair로 반환 |
associate() | 각 요소를 키와 값의 쌍으로 변형하여 map으로 반환 |
chuncked() | 컬렉션을 고정 크기의 청크로 나눠 새로운 컬렉션으로 반환 |
windowed() | 윈도우를 사용하여 주어진 크기의 서브 리스트 컬렉션을 반환 윈도우 : 요소의 연속된 부분 |
flatten() | 중첩된 리스트를 단일 리스트로 평탄화하여 반환 |
정렬
함수 | 설명 |
reversed() | 컬렉션의 순서를 뒤집어 새로운 컬렉션으로 반환 |
sorted() | 오름차순으로 정렬한 후 새로운 컬렉션으로 반환 |
sortedDescending() | 내림차순으로 정렬한 후 새로운 컬렉션으로 반환 |
sortedBy() | 식의 결과값으로 오름차순 정렬한 후 새로운 컬렉션으로 반환 |
sortedByDescending() | 식의 결과값으로 내림차순 정렬한 후 새로운 컬렉션으로 반환 |
sortedWith() | Comparator를 사용하여 컬렉션을 정렬합니다. |
shuffled() | 요소를 무작위로 섞어서 새로운 컬렉션으로 반환 |
변환
함수 | 설명 |
toList(), toSet(), toMap() | 컬렉션을 다른 타입으로 변환 |
toMutableList(), toMutableSet(), toMutableMap() | 컬렉션을 가변 컬렉션으로 변환 |
asSequence() | 컬렉션을 Sequence로 변환 |
asIterable() | 컬렉션을 Iterable로 변환 |
asList() | 배열을 List로 변환 |
가변 컬렉션 메서드
함수 | 설명 |
add() | 요소 한 개를 컬렉션에 추가 |
addAll() | 컬렉션의 전체 요소를 컬렉션에 추가 |
remove() | 요소 한 개를 컬렉션에서 제거 |
removeAll() | 컬렉션의 전체 요소나 조건식에 해당하는 모든 요소를 컬렉션에서 제거 |
removeIf() | 조건식에 해당하는 모든 요소를 컬렉션에서 제거 |
clear() | 컬렉션의 모든 요소를 제거 |
shuffle() | 요소의 순서를 무작위로 변경 |
getOrPut() | 지정된 키에 대한 값을 반환, 키가 맵에 없을 경우 새 값을 계산하고 저장한 후 반환 (Map) |
맵 전용 메서드
함수 | 설명 |
getOrDefault() | 키에 해당하는 값을 반환하되, 없을 경우 기본값 반환 |
put() | 맵에 키-값 쌍 한 개를 추가 |
putAll() | 맵에 컬렉션의 전체 키-값 쌍 을 추가 |
keys() | 맵의 키 반환 |
values() | 맵의 값 반환 |
entries() | 맵의 키-값 쌍 반환 |
filterKeys() | 키에 따라 필터링 |
filterValues() | 값에 따라 필터링 |
mapKeys() | 키를 변형하여 새로운 맵 생성 |
mapValues() | 값을 변형하여 새로운 맵 생성 |
컬렉션과 관련된 인터페이스, 클래스, 멤버, 확장 함수를 살펴보았습니다. 컬렉션은 배열보다 다양한 기능으로 데이터 구조를 사용할 수 있어 아주 유용합니다. 자주 사용되는 확장함수를 외워두는 것이 좋습니다. 다음 글에서는 코틀린의 표준함수에 대해 공부합시다.
'개발언어 > Kotlin : 코틀린' 카테고리의 다른 글
코틀린 익히기 13 - 입출력 (1) | 2023.10.09 |
---|---|
코틀린 익히기 12 - Scope Function (0) | 2023.10.06 |
코틀린 익히기 10 - 배열 (0) | 2023.10.01 |
코틀린 익히기 9 - 변성 Variance (0) | 2023.09.30 |
코틀린 익히기 8 - 제네릭 (0) | 2023.09.28 |