티스토리 뷰

Kotlin

코틀린 컬렉션 Kotlin Collections

IT Knowledge Share 2021. 7. 6. 19:08
반응형

코틀린에서 자주 사용하는 컬렉션에 대해 알아봅니다.

 

컬렉션은 우선 두 가지 종류로 나뉠 수 있는데, Immutable Collections와 Mutable Collections가 있습니다.

 

Immutable Collections는 값을 변경할 수 없는 컬렉션이고, Mutable Collections는 값 변경이 가능한 컬렉션입니다.

 

컬렉션 내에서 자주 사용되는 것으로 List, Set, Map 등이 있습니다.

 

1. Immutable Collection

 

우선 값 변경이 불가능한 Immutable Collection 중에서 List, Set, Map에 대해 알아봅시다.

값 변경이 불가능하기 때문에, 수정, 삭제, 추가가 불가능합니다.

 

1) ListOf

 

ListOf 메소드의 가장 큰 특징은 순서가 존재하고, 중복을 허용합니다. 순서가 있기 때문에 인덱스 사용이 가능합니다.

ListOf 메소드에서 값을 꺼낼 경우에는 get 메소드를 사용하면 됩니다.

 

아래의 예제를 살펴봅니다.

    val numberList = listOf<Int>(1, 2, 3, 3, 3)
    println(numberList)
    println(numberList.get(0))
    println(numberList[0])

출력값

[1, 2, 3, 3, 3]
1
1

위의 예시 처럼, ListOf는 중복을 허용하기 때문에, 출력 시 요소 3이 여러 개 들어가 있는 것을 확인할 수 있습니다. 또한 순서가 정해져 있으므로, 원하는 인덱스 번호로 값을 출력할 수 있습니다. 값을 꺼내올 때는 대괄호 안에 인덱스를 넣어 바로 꺼내오거나, get 메소드의 소괄호에 인덱스를 넣어 값을 꺼내올 수 있습니다.

 

* 배열과 마찬가지로 인덱스는 0부터 시작한다는 점을 주의하시기 바랍니다.

 

2) SetOf

 

SetOf 메소드는 일종의 집합과 같습니다. 해당 메소드의 가장 큰 특징은 동일값/중복값을 허용하지 않으며, 순서가 없다는 점입니다. 이는 ListOf와 대조되는 특징으로 사용 시 주의해야 합니다.

순서가 없기 때문에 인덱스 자체로나 get 메소드로 값을 가져올 수 없습니다.

 

아래의 예제를 봅시다.

반응형
    val numberSet = setOf<Int>(1, 2, 3, 3, 3)
    println(numberSet)
    
    numberSet.forEach {
        println(it)
    }

 출력값

[1, 2, 3]
1
2
3

위의 예시 처럼, 출력을 하면, 중복값을 허용하지 않으므로 [1, 2, 3]만 나오게됩니다.

순서가 없기에 get 메소드로 값을 가져오지 못하고, 일반적으로 forEach를 사용해서 값을 가져오게 됩니다.

 

3) MapOf

 

MapOf는 Key와 Value로 값을 가져오는 특성이 있습니다.

꺽쇠 안에 키값과 밸류값을 적고, get 메소드를 사용해 키값과 대응하는 밸류값을 불러올 수 있습니다.

키값과 밸류값을 넣을 때, 타입이 <String, Int>인 경우, "키값" to 밸류값이 됩니다.

당연히 타입이 <String, Boolean>인 경우, "키값" to True/False 겠죠? 중간에 'to'로 이어주는 것을 잊지마세요.

 

아래의 예제를 봅시다.

    val numberMap = mapOf<String, Int>("one" to 1, "two" to 2)
    println(numberMap)
    println(numberMap.get("one"))

출력값

{one=1, two=2}
1

출력을 보면, MapOf의 경우 한 쌍을 이뤄서 키값에 대응하는 밸류값이 묶인 요소들이 출력됩니다.

get 메소드로 값을 꺼낼 때, 키값만 사용하며, 출력되는 결과는 밸류값임을 알 수 있습니다.

 

2. Mutable Collection

 

이전까지는 값 변경이 불가능했던 Immutable Collection에 대해 알아봤습니다.

이제는 값 변경이 가능한 Mutable Collection을 알아보는데, 이전과 마찬가지로 List, Set, Map의 종류가 있습니다.

 

1) mutableListOf

 

해당 메소드는 ListOf와 사용법이 거의 동일하며, 단지 값을 변경하거나 추가하는게 가능하다는 것입니다.

값을 추가할 때는 add를, 변경 시에는 set을 사용하게 됩니다. 그 외에 removeAt 메소드 등을 사용해서 값을 삭제하는 것도 가능합니다.

 

예제를 살펴봅니다.

    val mNumberList = mutableListOf<Int>(1, 2, 3)
    mNumberList.add(2, 50)
    println(mNumberList)
    
    val a = mutableListOf<Int>(1, 2, 3)
    a.add(4)
    println(a)
    
    a.add(0, 100)
    println(a)
    
    a.set(1, 200)
    println(a)
    
    a.removeAt(3)
    println(a)

출력값

[1, 2, 50, 3]
[1, 2, 3, 4]
[100, 1, 2, 3, 4]
[100, 200, 2, 3, 4]
[100, 200, 2, 4]

위의 예제를 보면, mutableListOf의 경우 add, set 등을 사용해서 변경이나 추가가 가능합니다.

주의할 점은 add를 사용하면 추가만 되는 것이지 변경이 되는 것이 아닙니다.

mNumberList.add(2, 50)과 같이 2번째 인덱스 값에 50을 넣게 되므로 기존의 값인 숫자 3은 다음 인덱스 번호로 밀리게 됩니다. a.add(0, 100) 의 출력값도 마찬가지 경우입니다.

add 사용 시 인덱스를 지정하지 않고, 값만 적는 경우 무조건 마지막 인덱스에 값이 추가됩니다.

 

set 메소드를 사용해야만 원하는 인덱스의 값을 원하는 값으로 변경 가능하다는 점을 잊지 마세요.

removeAt 메소드는 말그대로 원하는 인덱스의 값을 삭제하는 기능을 합니다.

 

2) mutableSetOf

 

해당 메소드 또한 SetOf와 사용법이 거의 동일합니다. 순서가 없기 때문에 추가하고 싶은 값만 add를 사용해 넣어 주시면 됩니다. 

 

예제를 살펴 봅시다.

    val mNumberSet = mutableSetOf<Int>(1, 2, 3, 4, 4, 4)
    mNumberSet.add(10)
    println(mNumberSet)
    
    val b = mutableSetOf<Int>(1, 2, 3, 4)
    b.add(2) 
    println(b)
    
    b.add(0)
    println(b)
    
    b.remove(2)
    println(b)
    
    b.remove(200) 
    println(b)

 출력값

[1, 2, 3, 4, 10]
[1, 2, 3, 4]
[1, 2, 3, 4, 0]
[1, 3, 4, 0]
[1, 3, 4, 0]

출력값을 보시면, 첫 번째는 4가 3번 나와도 중복이 허용되지 않아 한 번만 출력되고, add를 사용해서 10을 마지막에 넣어준 경우입니다.

두번째 출력값은 add를 사용해서 2를 넣어주는데 이미 존재하므로, 출력해도 같은 배열이 나옵니다.

반대로 3번째 출력값을 보시면 0을 add로 추가시 없었던 값이므로 마지막에 추가되어 나오게 됩니다.

remove 메소드는 값을 삭제하는 기능을 하는데, 2처럼 원래 있던 값을 삭제하면, 배열에서 삭제되어 출력되지만, 200처럼 원래 없었던 값을 삭제하면 영향을 미치지 않습니다. 그렇다고 에러가 나는 것도 아닙니다.

 

3) mutableMapOf

 

MapOf가 키값과 밸류값으로 한 쌍을 이루고 있는 점을 기억하시나요? mutableMapOf 또한 사용법이 거의 비슷합니다. 단, 추가 시에 add 메소드를 사용하는 것이 아니라, put 메소드를 사용합니다.

 

아래의 예제를 봅니다.

    val mNumberMap = mutableMapOf<String, String>("hello" to "goodbye")
    mNumberMap.put("day", "night")
    println(mNumberMap)
    
    val c = mutableMapOf<String, Int>("one" to 1)
    c.put("two", 2)
    println(c)
    
    c.replace("two", 3) //해당 키값에 대응하는 값을 3으로 바꿈.
    println(c)
    
    println(c.keys) //키값만 출력
    
    println(c.values) //밸류값만 출력
    
    c.clear() //요소 전부 삭제
    println(c)

출력값

{hello=goodbye, day=night}
{one=1, two=2}
{one=1, two=3}
[one, two]
[1, 3]
{}

위의 예제에서 보듯이, 키값과 밸류값이 사용되며, 지정된 타입에 따라 각각 넣어주시면 됩니다. 추가 시에는 put 메소드를 사용합니다. put 메소드 사용 시에도 지정된 타입을 따라주셔야 합니다.

키값과 밸류값만 별도로 출력이 가능하며, clear를 사용해서 요소를 전부 삭제할 수도 있습니다.

반응형

'Kotlin' 카테고리의 다른 글

코틀린 반복문 2편 Kotlin Iterators  (0) 2021.07.06
코틀린 반복문 Kotlin Iterators  (0) 2021.07.06
코틀린 배열 Kotlin Array  (0) 2021.07.06
is, in 연산자  (0) 2021.07.06
엘비스 연산자 Elvis Operator  (0) 2021.07.05
댓글