알고리즘 5+1

Kotlin diary (3) - 컬렉션

일반정보 2021. 6. 26. 23:45

들어가는 글

저번 시간에 스트림 함수의 대해서 다뤄보다가, 컬렉션 함수의 대해서도 좀 알아보는 것도 좋다는 생각이 들었습니다. 대략적으로 알고는 있었지만, 그래도 세부적으로 알아보는게 더 좋겠죠. 이번시간에서는 kotlin에서 다루는 컬렉션 함수의 대해서 다뤄 보도록 하겠습니다. 

예제 코드는 https://play.kotlinlang.org/ 에서 확인해 보실 수 있습니다.

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

 

 

컬렉션이란 

kotlin이나 java나 모두 컬렉션은 가지고 있고, 사실 거의 다른 점은 거의 없습니다. 다만 이번글에서는 kotlin중심으로 진행하도록 하겠습니다. 

kotlin은 kotlin.collections 패키지를 가지고 있고 Iterable, Collection, List, Set, Map 등등의 클래스를 가지고 있습니다. ( kotlin-stdlib -> kotlin.collections )

참조 : https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/

 

kotlin에서는 java와 다른점이 하나 있다면 바로 읽기/쓰기 가 나누어져 있다는 것입니다. Collections에서는 읽기/쓰기를 할 수 없습니다. 즉 add() drop()메서스가 없다는 뜻 입니다. 읽기/쓰기를 하기 위해서는 MutableCollection 클래스를 상속해야 합니다. 따라서 가변컬렉션들은 앞에 Mutable이 붙습니다. 자세한 것은 뒤에서 설명하겠습니다. 

 

위의 내용을 정리하면 다음과 같습니다.

  • Iterable이 최상위 입니다. 
  • MutableIterable과 Collection은 Iterable를 구현합니다.  Collection을 통해 List, Set등을 구현 가능합니다. 
  • MutableCollection은 Collection과 MutableIterable을 구현합니다. MutableIterable을 통해 MutableList , MutableSet을 구현 가능합니다.

 

 

코틀린이나 자바나 거의 다른 것이 없는 컬렉션을 가지고 있습니다. Collection FrameWork에서의 주요 인터페이스는 크게 3가지로 나뉠 수 있습니다.  List, Map, Set입니다. 크게 각 특징을 정리해 보자면 다음과 같습니다. 

  • List - 데이터를 일렬로 구성합니다. 기본적으로 배열과 같이 가장 기본적인 컬렉션 인터페이스입니다. 기본적으로 인텍스가 부여되고 중복이 허용됩니다. 
  • Set - list와 비슷하지만, 중복을 허용하지 않습니다. 이러한 점에서 자료를 빠르게 조회하는데 유용합니다. 
  • Map - Key와 Value의 쌍의 값을 리스트 형태로 저장합니다. 리스트와 비슷할 수 있지만, 유일하게 컬렉션 인터페이스 중에서도 Collection인터페이스를 구현하지 않습니다. 별도의 Map인테페이스가 존재합니다. 

 

한번에 사진으로 정리하면 다음과 같습니다. 

 

클래스와 인터페이스 간의 상속관계

 

우선 이렇게 알아보았다면 이제 하나씩 알아보도록 하겠습니다.

 

 


List

위에서 설명했듯이 List는 데이터를 일렬로 정렬하고 관리하는 인터페이스입니다. 이 인터페이스로 상속해서 만들어진 클래스는 다음과 같습니다. 

1.List

  • - listOf() 메서드를 통해서 생성이 가능하고, 불변성을 가집니다. ( add()나 remove()등이 불가능 )

2. MutableList

  • - mutableListOf() 메서드를 통해서 생성이 가능하고, 가변성을 가집니다. (수정이 가능함)

3. ArrayList

  • - arrayListOf() 메서드를 통해서 생성이 가능하고, 가변성을 가집니다. ( MutableList와 거의 동일합니다. )
  • - MutableList 과의 차이로는 ArrayList가 MutableList 를 상속하고 있다는 점 정도입니다. ( 사용상의 차이로는 실질적인 차이는 없으나, 사용의도의 대해서는 차이를 둘 수 있는 정도로 구분 할 수 있는 듯 합니다. )

[참고 : https://stackoverflow.com/questions/43114367/difference-between-arrayliststring-and-mutablelistofstring-in-kotlin ]

 


 

Set

위에서 설명한 것 처럼 리스트처럼 요소들을 관리하되, 요소간의 중복을 허용하지 않는 인터페이스입니다.  이 인터페이스를 상속해서 만들어진 클래스는 다음과 같습니다. 

1. Set

  • - setOf() 메서드를 통해서 생성이 가능하고, 불변성을 가집니다.  Set의 기본적인 형태입니다. 

2. MutableSet

  • - mutableSetOf() 메서드를 통해서 생성이 가능하고, 가변성을 가집니다. 

3. HashSet

  • - hashSetOf() 메서드를 통해서 생성이 가능합니다. 
  • - hash 테이블에 저장되는 Set입니다.
  • - 순서를 무시합니다. 
  • - 정렬을 수행합니다. Set중에서 가장 빠른 편입니다.

4. SortedSet

  • - sortedSetOf() 메서드를 통해서 생성이 가능합니다. 
  • - 순서를 무시합니다.
  • - 이진의 형태로 정렬하는 Set입니다. 레드-블랙 트리(Red-black tree)를 이용합니다. 
  • - 정렬을 수행합니다. 검색과정에서는 HashSet 보다 더 빠릅니다.  

5. LinkedHashSet

  • - linkedSetOf() 메서드를 통해서 생성이 가능합니다. 
  • - 들어오는 데이터의 순서를 유지합니다. 

 


 

Map

위에서 설명한 것 처럼 리스트처럼 요소들을 관리하되, Key의 중복을 허용하지 않는 인터페이스입니다. 즉 Value는 중복을 허용하지만, Key는 고유한 것이여야만 합니다.( Key는 == 중복을 허용하지 않습니다. )

 또 하나의 특징으로는 Collection인터페이스에를 구현하는 것이 아닌 별도의 인터페이스 입니다. 이 인터페이스를 상속해서 만들어진 클래스는 다음과 같습니다. 

1. Map

  • - mapOf() 메서드를 통해서 생성이 가능합니다. 불변성을 가집니다. Map의 기본적인 형태입니다. 

2. MutableMap

  • - mutableMapOf 메서드를 통해서 생성이 가능합니다. 가변성을 가집니다. 

3. HashMap

  • - hashMapOf() 메서드를 통해서 생성이 가능합니다.
  • - hash 테이블에 저장되는 Map입니다.
  • - 순서를 무시합니다. 
  • - 정렬을 수행합니다. Map중에서 가장 빠른 편입니다.

4. SortedMap

  • - sortedMapOf() 메서드를 통해서 생성이 가능합니다.
  • - 순서를 무시합니다.
  • - 이진의 형태로 정렬하는 Map입니다. 레드-블랙 트리(Red-black tree)를 이용합니다. 
  • - 정렬을 수행합니다. 검색과정에서는 HashMap 보다 더 빠릅니다.  

5. LinkedHashMap

  • - linkedMapOf() 메서드를 통해서 생성이 가능합니다.
  • - 들어오는 데이터의 순서를 유지합니다.

 

 


 

 

정리

지금까지 컬렉션의 대해서 어느정도 알아보았습니다. 이를 대략적으로 정리해서 그림과 표로 나타내면 다음과 같을 것 입니다

  class is_Mutable method is_sorted
List List FALSE listOf() FALSE
MutableList TRUE mutableListOf()
ArrayList arrayListOf()
Set Set FALSE setOf() FALSE
MutableSet TRUE mutableSetOf()
HashSet hashSetOf() TRUE
SortedSet sortedSetOf()
LinkedHashSet linkedSetOf() FALSE
Map Map FALSE mapOf() FALSE
MutableMap TRUE mutableMapOf()
HashMap hashMapOf() TRUE
SortedMap sortedMapOf()
LinkedHashMap linkedMapOf() FALSE

(각 클래스의 정리)

 

클래스와 인터페이스 간의 상속관계