[Kotlin] Map

Subeen·2023년 11월 20일
2

Kotlin 문법

목록 보기
1/23

프로그래머스 문제를 풀며 헷갈리는 부분을 매번 검색하는 수고를 줄이고자 조금씩이라도 꾸준히 작성해보고자 한다 🤓 요즘 문제를 풀며 컬렉션을 가장 많이 사용하고 있는데 객체를 생성할 때 컬렉션의 immutable과 mutable에 대해 확실한 이해가 필요하다고 생각 되어 컬렉션 종류 및 사용법에 대해 우선적으로 정리해보겠다 !

Kotlin Collections

  • 코틀린의 컬렉션은 자바 컬렉션의 구조를 확장하여 구현했다.
  • 컬렉션은 크게 읽기 전용인 불변형(immutable)과 가변형(mutable)으로 나뉜다.
  • 자바에서는 가변형 컬렉션만 취급되므로 자바와 상호작용하는 코드에서는 주의해야 한다.
  • 변수를 선언할 때 불변형 val의 사용을 권장하듯이 컬렉션도 되도록 읽기 전용인 불변형으로 선언할 것을 권장한다.

컬렉션 종류

  • List
    • 불변형(읽기 전용) : listOf
    • 가변형 : mutableListOf, arrayListOf
  • Set
    • 불변형(읽기 전용) : setOf
    • 가변형 : mutableSetOf, hashSetOf, linkedSetOf, sortedSetOf
  • Map
    • 불변형(읽기 전용) : mapOf
    • 가변형 : mutableMapOf, hashMapOf, linkedMapOf, sortedMapOf

Kotlin에서 Map이란?

  • 맵(Map)은 특정 키가 부여된 값을 쉽게 찾을 수 있도록 설계된 키(Key)와 값(Value) 쌍의 집합이다. 키는 고유하며 중복이 불가능하지만 값은 중복될 수 있다.
  • MutableMapOf, HashMap, HashMapOf는 모두 같은 기능이며 HashMap은 MutableMap 인터페이스를 상속받은 구현체이다.

Map 생성 & 수정

  • Immutable Map
    mapOf()는 읽기 전용으로 데이터 수정이 불가능하다. mapOf()로 객체를 생성하고 number["one"] = 2와 같이 데이터를 수정하려고 할 경우 no set method providing array access 에러가 발생한다.
val number = mapOf<String, Int>("one" to 1, "two" to 2, "three" to 3, "four" to 4, "five" to 5)
println("${number}")  // {one=1, two=2, three=3, four=4, five=5}

number["one"] = 2  // error: no set method providing array access
  • Mutable Map
    가변 컬렉션인 mutableMapOf()를 사용하여 객체를 생성하며 데이터 수정이 가능하다.
    number["one"] = 2 와 같이 [] 에 key 값을 넣고 해당 데이터를 참조한 후 값을 수정한다.
val number = mutableMapOf<String, Int>("one" to 1, "two" to 2, "three" to 3, "four" to 4, "five" to 5)
println("${number}")  // {one=1, two=2, three=3, four=4, five=5}

number["one"] = 2

println("${number}")  // {one=2, two=2, three=3, four=4, five=5}

Map 데이터 추가

  • put(key, value) 함수를 사용하여 값을 추가한다.
    같은 key 값으로 여러번 추가할 경우 map의 key는 중복이 불가능하므로 가장 마지막에 추가 된 값으로 저장 된다.
val number = mutableMapOf<String, Int>("one" to 1, "two" to 2, "three" to 3, "four" to 4, "five" to 5)

// 추가 (1)
number["six"] = 6 // {one=1, two=2, three=3, four=4, five=5, six=6}

// 추가 (2)
number.put("ten", 10)  // {one=1, two=2, three=3, four=4, five=5, six=6, ten=10}

Map 데이터 삭제

  • remove(key)
    삭제하고자 하는 key 값을 가진 데이터를 삭제하는 함수이다.
val number = mutableMapOf<String, Int>("one" to 1, "two" to 2, "three" to 3, "four" to 4, "five" to 5)

number.remove("one")  // {two=2, three=3, four=4, five=5}

Map 정렬

  • toSortedMap() 함수를 사용하여 key를 기준으로 정렬하며 compareBy 함수는 오름차순으로 정렬이 되고 내림차순을 할 경우는 compareByDiscending 함수를 사용한다.
val number = mutableMapOf<Int, String>(1 to "one", 2 to "two", 3 to "three")

// 오름차순 정렬
val sorted = number.toSortedMap (compareBy{it})
println("${sorted}")  // {1=one, 2=two, 3=three}

// 내림차순 정렬
val sortedDescending = number.toSortedMap(compareByDescending {it})
println("${sortedDescending}")  // {3=three, 2=two, 1=one}
  • value를 기준으로 정렬하기 위해서는 MutableMap을 List로 변환한 후 sortedWith 함수를 사용하여 정렬한다.
    sortedWith 함수의 인자로 Comparator를 생성하여 전달하는데 compareBy 함수를 이용하여 pair의 second 요소를 정렬 기준으로 선택한다.
    정렬 된 List를 다시 Map으로 변환한다.
val number = mutableMapOf<Int, String>(1 to "one", 2 to "two", 3 to "three")

// 오름차순 정렬
val sorted = number.toList().sortedWith(compareBy({it.second})).toMap()
println("${sorted}") //  {1=one, 3=three, 2=two}

// 내림차순 정렬
val sortedDescending = number.toList().sortedWith(compareByDescending({it.second})).toMap()
println("${sortedDescending}") // {2=two, 3=three, 1=one}

Map 데이터 출력하기 (for문)

val number = mutableMapOf<Int, String>(1 to "one", 2 to "two", 3 to "three")

number.forEach { key, value ->
	println("${key}, ${value}")
}
        
for ((key, value) in number) {
	println("${key}, ${value}")
}

> 출력 결과
1, one
2, two
3, three
1, one
2, two
3, three

Map Method

  • containsKey(key) : map에 해당 key의 존재 유무를 반환한다.
  • containsValue(value) : map에 해당 value의 존재 유무를 반환한다.
  • get(key) : key에 해당 되는 value를 반환한다.
  • getOrDefault(key, defaultValue) : map에 key가 존재할 시 key에 대한 value를 반환하고 존재하지 않을 시 defaultValue를 반환한다.
  • isEmpty() : map이 비어있는지 확인한다.
  • isNotEmpty() : map이 비어있지 않은지 확인한다.
  • size/count() : map의 데이터 개수를 반환한다.
  • keys : key에 대한 컬렉션을 반환하며 중복이 불가능하므로 MutableSet이 반환된다.
  • values : value에 대한 컬렉션을 반환하며 MutableCollection이 반환된다.
val numberMap = mutableMapOf<Int, String>(1 to "one", 2 to "two", 3 to "three")
        
val containsKey1 = numberMap.containsKey(1)
val containsKey2 = numberMap.containsKey(5)
        
println("${containsKey1}")  // true
println("${containsKey2}")  // false
        
val containsValue1 = numberMap.containsValue("one")  
val containsValue2 = numberMap.containsValue("five")  
        
println("${containsValue1}")  // true
println("${containsValue2}")  // false
        
val getKey = numberMap.get(1)
        
println("${getKey}")  // one
        
val getOrDefault1 = numberMap.getOrDefault(2, "zero")
val getOrDefault2 = numberMap.getOrDefault(5, "zero")
        
println("${getOrDefault1}")  // two
println("${getOrDefault2}")  // zero
        
val isEmpty = numberMap.isEmpty()
val isNotEmpty = numberMap.isNotEmpty()
        
println("${isEmpty}")  // false
println("${isNotEmpty}")  // true
        
val size = numberMap.size
val count = numberMap.count()
        
println("${size}")  // 3
println("${count}")  // 3
        
val keys = numberMap.keys
val values = numberMap.values
        
println("${keys}")  // [1, 2, 3]
println("${values}")  // [one, two, three]

참조

MutableMap을 value 기준으로 정렬하기
Mutable Map과 HashMap

profile
개발 공부 기록 🌱

0개의 댓글