Programming Language/Kotlin

[Kotlin] Collections Map 사용법

개발왕 금골드 2020. 8. 31. 12:49
반응형

안녕하세요 골드입니다.

 Kotlin의 Collections 중 Map에 대해서 글을 쓰도록 하겠습니다. Map은 다른 자료구조와 다르게 조금 특이하게 직접 정의한 Key와 Value를 쌍으로 데이터를 저장하는 방식입니다. List에서 index를 통해 value에 접근했다면 Map에서는 key를 통해 value에 접근할 수 있습니다. 하나의 Map 안에서 Key는 중복이 불가하지만, value는 중복이 가능합니다. 이제 구체적으로 알아보겠습니다.

 

 

1. Map 생성하기

 먼저 Map을 하나 생성하겠습니다. 이해하기 쉽도록 메뉴라는 map 데이터를 생성하였습니다. 메뉴판은 Map을 설명하기 적절한 비유라는 생각이 듭니다. 보통 한 메뉴판에 같은 이름을 가진 메뉴는 없지만 같은 가격을 갖는 메뉴는 존재할 수 있습니다.

Map 생성

 하나의 Map에서 key는 모드 같은 타입이어야 하며, value도 모두 같은 타입이어야 합니다. key와 value는 다른 타입이어도 됩니다. 표현하자면 menu 변수는 val menu: Map<String, Int>로 표현할 수 있습니다. Map을 생성할 때 key와 value는 to를 사용해서 대응되는 값을 전달합니다. 아래에 주석으로 처리된 menu의 선언문도 위와 동일한 코드입니다. (컴파일러는 위 방식을 추천합니다.) println()으로 출력해보면 =으로 key와 value가 연결된 것을 볼 수 있습니다. 

 

key 중복불가

 만약 초기화 중 같은 key값을 가진다거나, 혹은 이미 존재하는 key값을 추가하려고 한다면 key는 중복불가이기 때문에 Map에 새로 추가되지 않고 value만 바뀌게 됩니다. 마지막에 선언된 값이 value에 저장됩니다. 

 

Map에 접근

 menu에 접근하는 방법입니다. List와 접근 방법이 비슷합니다. 다른 점은 [] 사이에 index가 아닌 key값을 넣어줘야 그에 해당하는 value값을 반환합니다. 만약 존재하지 않는 key값을 넣는다면 null을 반환합니다. getOrDefault()는 안전한 프로그래밍을 도와주는 함수입니다. key값이 존재하지 않는다면 먼저 정의한 defaultValue를 반환합니다. defultValue를 출력할 뿐 menu 변수에 추가되는 것은 아닙니다. 

 

Map의 특징

 Map을 더 풍부하게 사용할 수 있는 keys와 values함수입니다. key값만 필요하거나 value값만 필요한 경우에 사용할 수 있습니다. Collections형태로 반환되며 toList()나 toSet()을 사용하여 다른 Collections로 변경하거나 따로 변수로 저장해서 사용할 수도 있습니다. 

 

 

2. Map의 값 추가, 변경하기

 이제 menu변수를 mutableMap로 변경하고 값을 추가하거나 변경하는 방법에 대해서 알아보겠습니다. 

  Map은 add()가 아닌 put()함수를 사용합니다. put()함수에 첫 번째 매개변수로 key, 두 번째 매개변수로 value를 정의하면 됩니다. 혹은 다른 Collections와 마찬가지로 += 연산자를 사용해서 값을 추가할 수도 있습니다. += 연산자를 사용할 경우에는 to를 사용해서 데이터를 추가합니다. 만약 put()을 사용했는데, key값이 이미 존재한다면 value값이 업데이트됩니다. 그렇기 때문에 put()이 추가와 동시에 값을 변경하는 역할도 수행할 수 있습니다. 혹은 List와 같이 단순히 []사이에 key를 넣고 특정 데이터를 참조한 후 = 연산자로 값을 변경할 수도 있습니다.

 

 

3. Map의 함수들을 이용한 다양한 사용법

 

 Map에 있는 데이터를 삭제하는 방법부터 보겠습니다. 

 remove() 함수를 사용하거나 -= 연산자로 key를 전달해서 key값의 데이터를 삭제할 수 있습니다. menu 변수가 var가 아닌 val로 선언된 이유는 Map에서 key값이 불변, 읽기 전용이기 때문입니다. key값은 중복이 불가능하면서 동시에 수정 혹은 변경이 불가능합니다. 다만 mutableMap으로 선언되었기 때문에 추가나 삭제는 가능합니다. 

 

 Map은 단순히 값만 추가할 수도 있지만 다른 Collections를 Map에 추가할 수도 있습니다. 위 코드는 단순히 + 연산자를 사용한 후 println()으로 출력했기 때문에 따로 저장은 되지 않은 모습입니다. 위에 Pair()는 Map과 같이 key-value 형태를 가진 함수입니다. key와 value를 쌍으로 갖기 때문에 Map에 추가가 되는 모습입니다. Set을 Map처럼 사용한 저 코드가 낯설 수 있습니다.

 Set의 데이터를 저렇게 쌍으로 선언되면 Set 내부적으로 괄호 안에 두 데이터가 저장됩니다. 이는 이차원을 의미하는 것이 아니라 하나의 데이터가 이런 형식으로 저장된 것이며, List에서도 같은 형식으로 저장할 수 있습니다.

 

 Map에 filter를 적용했습니다. filter() 함수는 다른 Collections에서도 사용이 가능합니다. menu에 filter() 함수를 적용하였고, filter 내부에서 menu의 key와 value를 람다 형태로 전달할 수 있습니다. 위 코드는 menu에 filter를 적용하여 filter 내부에서 key값과 value를 전달합니다. 전달받은 key값 중에 끝이 "치킨"으로 끝나는 key값이 존재한다면 새로운 변수 chickenMenu에 해당 key와 value를 전달한 후 저장합니다. filter를 거쳐서 새로운 변수 chickenMenu가 초기화되었고, println()으로 출력하면 치킨 메뉴만 전달된 것을 볼 수 있습니다.

 

 

여기까지 골드였습니다.

감사합니다.

 

참고자료 : https://kotlinlang.org/docs/reference/map-operations.html

 

Map Specific Operations - Kotlin Programming Language

 

kotlinlang.org

 

반응형