[Kotlin] Collection

zirryo·2023년 5월 7일
0

⚡️ STUDY

목록 보기
14/15
post-thumbnail




1 - Collection Overview

A collection usually contains a number of objects (this number may also be zero) of the same type. Objects in a collection are called elements or items.
...
(중략)
...
Kotlin lets you manipulate collections independently of the exact type of objects stored in them. In other words, you add a String to a list of Strings the same way as you would do with Ints or a user-defined class. So, the Kotlin Standard Library offers generic interfaces, classes, and functions for creating, populating, and managing collections of any type.

코틀린 공식 문서를 보면 컬렉션을 다음과 같이 설명하고 있다.

  • 컬렉션은 동일한 유형을 가진 여러 개(0개일 수도 있음)의 객체를 포함한다.
  • 컬렉션에 있는 객체를 요소 또는 항목이라고 한다.
  • 코틀린을 통해 컬렉션에 저장된 객체의 정확한 유형과 상관없이 컬렉션을 조작할 수 있다.
  • 코틀린은 모든 유형의 컬렉션을 만들고, 덧붙이고, 관리하기 위한 일반 인터페이스, 클래스, 함수를 제공한다.




2 - Collection Interface

컬렉션 인터페이스의 다이어그램



컬렉션 인터페이스의 두 가지 유형

  1. read-only interface that provides operations for accessing collection elements.
    : 컬렉션 요소에 액세스하기 위한 작업을 제공하는 읽기 전용 인터페이스

  1. mutable interface that extends the corresponding read-only interface with write operations: adding, removing, and updating its elements.
    : 요소 추가, 제거 및 업데이트와 같은 쓰기 작업으로 해당 읽기 전용 인터페이스를 확장하는, 변경 가능한 인터페이스

컬렉션 인터페이스는 read-onlymutable 두 가지 유형으로 나뉜다.

쓰기 작업은 동일한 컬렉션 개체를 수정하므로 참조가 변경되지 않기 때문에 mutable collection을 var 변수로 선언하지 않아도 쓰기 작업을 수행할 수 있다.

다만, val 로 선언한 컬렉션을 재할당하면 컴파일 오류가 발생하므로, var 로 선언해야 한다.



예시 코드

listA : read-only list
listB : mutable list

    // listA.add("d") -> 컴파일 에러
    // listA.remove("d") -> 컴파일 에러
    // listA[1] = "k" -> 컴파일 에러
    
    listB.add("D")
    listB.remove("D")
    listB[1] = "K"
  • listA 는 읽기 전용 컬렉션. 요소를 추가, 삭제, 업데이트 할 수 없다.
  • listB 는 가변 컬렉션. 요소를 추가, 삭제, 업데이트 할 수 있다.

    listA = listOf("e", "f")
    listB = mutableListOf("E", "F")
  • 두 리스트 모두 var 변수이므로, 재할당할 수 있다.



mutable list 의 크기와 포함하고 있는 요소를 쉽게 파악할 수 있도록 printList 람다 함수를 생성하였다.


출력된 결과는 위와 같다.
요소의 쓰기 작업재할당이 정상적으로 수행된 것을 확인할 수 있다.



다만, val 로 선언했을 경우 재할당할 수 없다.




3 - List

  • 인덱스(위치를 나타내는 정수)로 요소에 접근할 수 있는 정렬된 컬렉션이다.
  • 인덱스는 첫 번째 요소의 인덱스인 0부터 시작하여 마지막 인덱스는 (리스트 크기 - 1) 이다.
fun main() {
    val numbers = listOf("one", "two", "three", "four")
    println("number의 개수: ${numbers.size}")
    println("세번째 element: ${numbers.get(2)}")
    println("첫번째 element: ${numbers[0]}")
    println("\"two\" 의 인덱스: ${numbers.indexOf("two")}")
}


[출력]
number의 개수: 4
세번째 element: three
첫번째 element: one
"two" 의 인덱스: 1



  • 요소는 목록에서 두 번 이상 나타날 수 있다. (null 포함, 중복 허용)
  • 두 목록의 크기가 같고 구조적으로 동일한 요소가 동일한 위치에 있으면 동일한 것으로 간주한다.
fun main() {
    class Car(var brand: String, var price: Int)
    val cayenne = Car("porsche", 12000)
    val santaFe = Car("hyundai", 3500)

    val carList1 = listOf(cayenne, santaFe, santaFe)
    val carList2 = listOf(cayenne, santaFe, santaFe)
    val carList3 = listOf(cayenne, cayenne, santaFe)
    println(carList1 == carList2)
    println(carList1 == carList3)
}


[출력]
true
false




4 - Set

  • 고유한 요소의 모음이다.
  • 집합의 수학적 추상화를 반영하며 반복이 없는 개체 그룹이다.
  • 일반적으로 집합 요소의 순서를 보장하지 않는다.
  • 두 Set의 크기가 같고 각 요소에 대해 동일한 요소가 있으면, 각 요소의 순서가 달라도 동일한 Set 으로 간주한다.
fun main() {
    val numSet1 = setOf(1, 2, 3, 4, 5, 5)
    val numSet2 = setOf(3, 5, 2, 4, 1)
    println(numSet1)
    println(numSet2)
    println(numSet1 == numSet2)
}


[출력]
[1, 2, 3, 4, 5]
[3, 5, 2, 4, 1]
true

// 중복된 요소를 삽입해도 중복되는 요소 없이 Set 이 구성되는 것을 확인할 수 있다.



  • MutableSet 은 요소의 추가, 삭제, 업데이트 등의 쓰기 작업을 수행할 수 있는 Set 이다.
  • Set 은 요소의 추가, 삭제, 업데이트 등의 쓰기 작업을 수행할 수 없다.
fun main() {
    val numSet1 = setOf(1, 1, 2, 3, 4, 5)
    val numSet2 = mutableSetOf(3, 5, 2, 4, 1)
    println(numSet1 == numSet2)

    // numSet1.add(6) -> 컴파일 에러
    // numSet1.remove(1) -> 컴파일 에러
    
    numSet2.add(6)
    numSet2.remove(1)
    
    println("numSet2 contains 6: ${numSet2.contains(6)}")
    println("numSet2: $numSet2")
}


[출력]
true
numSet2 contains 6: true
numSet2: [3, 5, 2, 4, 6]




5 - Map

  • Map키-값 쌍의 집합이다.
  • 개체 간의 논리적 연결을 저장하는 데 유용하다.
  • List가 인덱스를 이용하여 값을 찾듯이, key 를 이용하여 value를 찾을 수 있다.
fun main() {
    val colorMap = mapOf<Int, String>(1 to "red", 7 to "blue", 5 to "black", 3 to "green")
    println("1 is ${colorMap[1]}")
    println("5 is ${colorMap[5]}")
    println(colorMap)
}


[출력]
1 is red
5 is black
{1=red, 7=blue, 5=black, 3=green}

// key 와 value 의 자료형은 타입 추론이 가능하므로 생략할 수 있다.



  • 키(key)는 고유하며 각각은 정확히 하나의 값에 매핑된다.
  • 즉, 같은 키에 다른 값을 넣으면 기존의 값이 새로운 값으로 대체된다.
  • 값(value)은 중복될 수 있다.
fun main() {
    val colorMap = mapOf<Int, String>(1 to "red", 7 to "green", 5 to "black", 7 to "black")
    println("7 is ${colorMap[7]}")
    println(colorMap.size)
    println(colorMap)
}


[출력]
7 is black
3
{1=red, 7=black, 5=black}

// 7의 value 는 green 이 black으로 대체된다.
// value 는 중복이 허용된다. (black)



  • MutableMap 은 요소의 추가, 삭제, 업데이트 등의 쓰기 작업을 수행할 수 있는 Map 이다.
  • Map 은 요소의 추가, 삭제, 업데이트 등의 쓰기 작업을 수행할 수 없다.
fun main() {
    val colorMap1 = mapOf<Int, String>(1 to "red", 7 to "green", 5 to "black", 7 to "black")
    val colorMap2 = mutableMapOf(1 to "red", 7 to "green", 5 to "black")

//    colorMap1[3] = "pink" -> 컴파일 에러
//    colorMap1[1] = "orange" -> 컴파일 에러

    colorMap2[3] = "pink" // (새로운 값 추가)
    colorMap2[1] = "orange" // (기존 값 대체)

    println(colorMap2)
    
    
    [출력]
    {1=orange, 7=green, 5=black, 3=pink}
}




🔗 reference

IDE : IntelliJ IDEA 2022.2 (Ultimate Edition)
Theme : Gerry Oceanic
SDK : 11 Azul Zulu version 11.0.15

0개의 댓글