본문 바로가기

프로그래밍 언어/코틀린_Kotlin_더파기

Kotlin더파기_12_Collection_Map

컬렉션 Map(맵) 타입은 List, Set과 마찬가지로 기본적으로 읽기전용이다.

다른 기능도 비슷하지만 특징적인 점은 '쌍'으로 데이터를 저장한다는 것이다.

 

Map은 Key(키)와 Value(값)을 한 쌍으로 만들어 이것을 entry(엔트리)라는 데이터로 저장한다.

Map의 Key는 하나뿐인 키를 가지고 자신과 쌍을 이룬 Value(값)을 기억한다.

 

그러므로 Map은 Key가 유일하며 Set은 Value(값)이 유일하다.

 

Map 만들기

 

Map을 만들 때는 mapOf , mutableMapOf 함수를 사용한다.

 

각각의 애완동물을 위해 물건을 살 수 있는 돈이 정해져 있다고 가정하고 이것을 Map으로 만들면 다음과 같다.

 

 

맵을 만들어 출력해 보면 key=value 모양으로 나타난다.

이때 key는 모두 같은 타입이어야 하고 value는 모두 같은 타입이어야 한다.

 

위에서 맵을 저장할 변수의 타입을 표시하지 않은 것은 코틀린의 타입 추론 기능이 있기 때문이다.

정확히 적으려면 다음과 같이 할 수 있다.

 

val petMoney : Map<String, Double>

 

위 코드에서 key와 value를 짝 지을 때 to 를 사용했다.

to는 '~에, ~로' 처럼 방향을 나타내는 영어이다.

중학교 수학의 집합에서 일대일 대응을 만들 때도 화살표를 사용했다.

이제 Map에서 왜 to 를 사용했는지 이해할 수 있을 것이다.

 

본래 to는 함수이기 때문에 다음과 같이 표현해야 한다.

 

mapOf("dog".to(50.0), "cat".to(50.0), "bird".to(50.0))

 

이 표현이 조금 복잡하기 때문에 간단하게 to 만 사용하도록 한 것이다.

내부적으로 to 함수를 사용하는 것은 코틀린이 자동으로 해결한다.

 

참고로 쌍을 만드는 타입인 Pair를 사용해서 다음과 같이 표현할 수도 있다.

 

val petMoney = mapOf ( Pair("dog", 50.0), Pair("cat", 50.0), Pair("bird", 50.0))

 

Pair를 사용하는 것도 복잡하므로 간단하게 to를 사용하면 된다.

 

중복 키 추가

변경할 수 있는 맵(mutableMapOf)이 있을 때 데이터 값을 추가하면 같은 key는 덮어 쓰기하고 value 값도 새 값으로 덮어 쓰기한다.

 

 

위와 같이 중복된 key가 들어가면 저장되는 entry(엔트리)는 key는 중복되지 않고 value값은 마지막 값으로 바꿔진다.

 

 

Map값 가져오기

 

맵 값을 가져올 때는 여러 가지 방법이 있다.

위 그림처럼 인덱스 연산자 [ ] 를 사용할 수 있다.

 

getValue 함수는 key를 입력하여 value값을 호출할 수 있다.

getOrElse함수는 key를 입력하여 value값을 가져오거나 만약 호출한 key가 없으면 익명함수{}에 있는 내용을 반환한다.

getOrDefault함수는 key를 입력하여 value값을 가져오거나 만약 호출한 key가 없으면 쉼표 다음의 디폴트값으로 반환한다.

 

Map에 항목 추가하기

이번에는 Set에서 애완동물과 색의 랜덤 조합으로 만들어진 컬렉션에 대해 각각 사용할 수 있는 금액을 지정해 보자.

예를 들어 blue dog 는 50.0 만원, yellow bird는 50.0 만원 식으로 만들 수 있다.

 

먼저 앞 글의 Set에서 아래 그림과 같이 중복을 제거(deDuplication)하기 위해 mutableSetOf 코드를 만들었었다.

 

 

 

마찬가지로 petMoney도 mutableMapOf를 사용해서 변경 가능하도록 바꿔야 한다.

바로 위 10번줄은 사용하지 않으므로 주석으로 처리하거나 삭제한다.

22~24번 줄 코드는 Set으로 중복 제거한 값 animalColor를 key로 사용하고 value를 50.0으로 정하여 deDuplication 맵에 추가하는 코드이다. it 키워드는 deDuplication에 저장되어 있는 요소를 대신하여 나타내는 키워드이다.

 

Mutator(변경자) 함수

 

mutableMapOf의 항목을 바꾸기 위해서 사용할 수 있는 mutator(변경자) 함수들은 다음과 같은 것들이 있다.

 

  • 인덱스 [ ] : key값 추가, 변경
  • put : key값 추가, 변경
  • += : 항목(key-value) 추가, 변경
  • putAll : 모든 항목 추가
  • getOrPut : 항목값 반환, key없으면 항목 추가 후 항목값 반환
  • - : 이하 항목 제외하고 새 Map 반환
  • remove : 항목 삭제
  • -= : 항목 삭제
  • clear : 모든 항목 삭제 

 

  • Collection 정리
타입 순서 고유성 저장 단위 해체
List 있다 없다 요소 된다
Set 없다 있다(요소) 요소 안된다
Map 없다 있다(키) 항목(키-값) 안된다

 

Wraven...