728x90
컬렉션의 구조와 list 사용

컬렉션의 구조와 list 사용

  • 컬렉션(Collection) : 자주 쓰이는 기초적인 자료구조를 모아둔 프레임워크
  • 코틀린의 컬렉션
    • list : listOf(불변형) / mutableListOf, arrayListOf(가변형)
    • set : setOf(불변형) / mutableSetOf, hashSetOf, linkedSetOf, sortedSetOf(가변형)
    • map : mapOf(불변형) / mutableMapOf, hashMapOf, linkedMapOf, sortedMapOf(가변형)
  • Collection의 특징
    • Iterable에서 확장
    • Collection에서 확장된 Set, List는 읽기 전용
  • collection 멤버
    • size : 크기
    • isEmpty() : 빈 컬렉션인 경우 true
    • contains(E) : 특정 요소(E)가 있다면 true
    • containsAll(collection) : 인자로 받아들인 Collection이 있다면 true
  • MutableIterable, MutableCollection 클래스
    • 요소를 추가, 제거 기능을 수행 가능
    • add(E) : 인자를 추가 후 true 반환 / 요소가 있거나 중복 불허인 경우 false
    • remove(E) : 인자를 삭제 후 true 반환 / 삭제 요소가 없으면 false
    • addAll, removeAll : 컬렉션 인자를 모두 추가/삭제
    • retainAll : 컬렉션 인자를 받아 해당 요소만 보유
    • clear() : 컬렉션 모든 요소를 삭제
  • List
    • 순서에 따라 정렬된 요소를 갖는 컬렉션
    • 불변형 리스트는 listOf()로 생성
    • 가변형 리스트는 mutableListOf(), arrayListOf()로 생성
    • 함수 인자는 vararg로 선언되어 있으므로 원하는 만큼 지정 가능

list 멤버와 이해

  • 코틀린의 가변형 리스트
    • arrayListOf
      • 가변형 List를 생성하나 자바의 ArrayList를 반환함
    • mutableListOf
      • 가변형 List를 생성하여 코틀린 MutableList를 반환
    • add()와 removeAt()으로 추가/삭제 가능
    • toMutableList()로 불변형 리스트를 가변형으로 변환 후 반환할 수 있음
  • List vs Array
    • Array 배열은 내부 구조상 고정된 크기를 갖게 됨
    • List의 경우 인터페이스로 설계되어 하위에서 특정 자료구조로 구현함
    • Array는 제네릭 관점에서 무변성, List는 공변성

Set, Map 컬렉션의 이해

  • Set
    • 정해진 순서가 없는 요소의 집합
    • 동일 요소가 중복되지 않음
  • hashSetOf
    • 자바의 HashSet을 만듬
    • 테이블에 요소를 저장 및 삭제 가능
    • hash table : 내부적인 키와 인덱스로 검색 및 변경을 빠르게 수행 가능
    • 정렬이 없지만 해쉬값으로 검색하므로 검색 속도는 O(1)의 시간 복잡도
  • sortedSetOf
    • 자바 TreeSet으로 반환
    • java.util.* 패키지를 임포트해야 함
    • 이진 탐색, Red-black 알고리즘을 이용
    • hash보다 추가/삭제 시간은 더 걸리나 검색/정렬이 뛰어남
  • linkedSetOf
    • 자바의 LinkedHashSet으로 반환
    • 연결 리스트 형태로 자료구조를 구성
    • 다른 Set보다 느리나 포인터 연결로 메모리 공간이 효율적으로 사용됨
  • Map
    • 키-값으로 연결된 요소 저장
    • 키는 중복 가능하나 값은 중복 불가
      • 기존 키와 동일한 경우 새로운 값으로 대체

컬렉션의 확장함수 - 연산, 집계, 검사

  • 코틀린 확장 함수 : 연산자, 집계, 검사, 필터, 변환을 제공
  • 컬렉션 연산자
    • +, - : 요소의 추가 혹은 제거 / 맵의 경우 일치하는 값
    • +/- ListOf : 리스트 병합 / listOf 원소와 일치하는 요소 제거
    • +Pair(값, 키) : Map 요소 추가
    • mapOf(값 to 키) : Map의 요소 추가
  • 요소의 집계
    • forEach(forEachIndexed) : 요소(+인덱스) 순회
    • onEach : 각 요소를 순환 후 컬렉션 반환
    • fold : 초기값 및 정해진 식에 따라 값 반환
      • reduce : 초기값 없이 정해진 식에 따라 값 반환
    • foldRight, reduceRight : 역순으로 동작하며 값 반환
//컬렉션 연산 fun main() { val list1 = listOf(1, 2, 3) val list2 = listOf("one", "two", "three") println(list1+ 4 ) //[1, 2, 3, 4], 산술 연산자로 새 원소가 합쳐진 새로운 리스트를 반환 } //컬렉션 fold val list = listOf(1, 2, 3, 4, 5) println(list.fold(4){total, next -> total+next}) //4+1+2+...+5 println(list.foldRight(3){total, next -> total+next}) //3+5+4+...+1 println(list.reduce{total, next -> total+next})//1+2+3+4+5

컬렉션의 확장함수 - 필터, 변환, 시퀀스

  • map() : 컬렉션 요소를 일괄적으로 식 적용 후 새 컬렉션 반환
fun main() { val list = listOf(1,2,3,4,5) println(list.map({it*2})) //[2, 4, 6, 8, 10], it은 리스트 원소를 가리킴 val mapIndex = list.mapIndexed{index, it -> index*it} //mapIndexed : 인덱스와 컬렉션 멤버로 연산 //[0, 2, 6, 12, 20] }
  • flatMap() : 각 요소에 식을 적용 후 새 컬렉션 반환
println(list.flatMap{listOf(it, 'A')}) //[1, A, 2, A, ...]
  • groupBy() : 요소를 그룹화한 후 Map으로 반환
  • 정렬 연산
    • reversed() : 역순
    • sorted() / sortedDescending() : 오름/내림차순 정렬
  • 시퀀스 : toList(), count()같은 연산에 의해 크기가 결정되는 특수 컬렉션
    • 지속적으로 내용이 추가되는 로그 파일 등
    • generateSequence(seed) {람다식} : 시퀀스 정의
    • take() : 원하는 요소 개수 획득
    • toList() : 시퀀스를 리스트 컬렉션으로 반환
728x90

+ Recent posts