맵(Map)
10 컬렉션
맵(Map)

앞선 두 강의에서 배열과 슬라이스를 배웠습니다. 두 컬렉션의 공통점은 인덱스 번호를 임의대로 바꿀 수 없다는 것입니다. 예를 들어, 단어 사전을 배열 혹은 슬라이스를 이용해 만든다고 생각해봅시다. 단어를 추가할 때마다 인덱스 0번부터 Love, loyalty, root, submit ... 등등의 단어를 순차적으로 저장하고 해당하는 인덱스 번호를 통해 저장돼 있는 값을 쓰거나 저장할 수 있는 것이 전부입니다.

그렇기 때문에 사전의 고유 형태인 '단어 : 뜻' 형태로 저장할 수 없습니다. 그래서 필요한 것이 바로 key 값과 그에 해당하는 value 값을 매핑해 저장하는 'Hash table'입니다. 이것을 Go언어에서도 제공하는데 바로 'map(이하 맵)'이라는 컬렉션입니다. 이는 Ruby에서의 hash와 python에서의 dicts와 같은 기능을 합니다. map은 "key : value" 형식으로 값을 매핑해서 저장합니다. 따라서, 맵을 활용한다면 "love:사랑, root:뿌리, submit:제출하다"와 같은 형식으로 값을 저장할 수 있습니다.


그리고 슬라이스와 맵의 공통점은 두 컬랙션 모두 값을 직접적으로 저장하는 것이 아닌 '참조 타입(Reference type)'이라는 점입니다. 따라서 선언과 값을 초기화 함에 있어서 슬라이스와 같은 방법과 이유를 가진다고 생각하면 됩니다(참조 타입의 선언 방법은 Slice 강의 참고). 맵의 선언은 "var 맵이름 map[key자료형]value자료형" 형식으로 합니다. 예를 들어, int형 key값과 string형 value값을 가지는 a라는 이름의 맵을 선언할 때는 var a  map[int]string과 같이 선언할 수 있습니다. 이전 강의에서 말했다시피, 이렇게 선언만 하고 값을 초기화하지 않았다면 'Nil map'이 됩니다.


선언과 동시에 초기화 하는 것이 좋은데 초기화하는 방법은 아래 간단한 코드를 통해 설명하겠습니다.

실행 언어: go
실행 결과를 확인해보세요!

map 변수의 추가, 갱신, 삭제


맵 컬렉션에 메모리가 할당(make() 함수 혹은 {}를 사용한 값 초기화)됐으면 값을 추가, 갱신, 삭제할 수 있습니다. 슬라이스는 값을 추가하기 위해 append() 함수를 사용했지만, 맵에서의 key값은 특별(unique)하기 때문에 "맵이름[key] = value" 형식으로 값을 추가할 수 있습니다. 주의할 점은 이미 있는 key값에 다시 다른 value값을 저장한다면 최근 저장한 값으로 갱신됩니다.

그리고 delete() 함수를 이용해 저장된 값을 삭제할 수 있습니다. "delete(맵이름, key)" 형식을 입력하면 key값에 해당되는 value값이 같이 삭제됩니다.


map의 데이터를 추가, 갱신, 삭제하는 아래 예시 코드를 바로 실행해보세요.

실행 언어: go
실행 결과를 확인해보세요!

Map의 key 체크와 value 읽기


맵을 사용하다 보면 key가 사용되고 있는지(occupied), 만약 사용된다면 어떤 value값이 저장돼 있는지 알아야 할 때가 있습니다. 이럴 때는 '맵이름[key]'의 값을 반환하면 됩니다.

이것은 즉 '컬렉션이름[인덱스]'를 의미하는데 앞서 배운 두 컬렉션에서 '컬렉션이름[인덱스]'는  단순히 해당 컬렉션의 인덱스에 저장돼 있는 값을 반환했습니다. 예를 들어, 배열이나 슬라이스의 arr[3]은 인덱스 3에 저장돼 있는 값을 반환합니다. 그리고 만약 인덱스의 범위를 넘는다면 에러가 발생합니다.

하지만 맵은 '컬렉션이름[인덱스]'의 사용에 있어서 다른 두 컬렉션과 차이점이 있습니다. '맵이름[key]'는 key에 저장돼 있는 value 값을 반환할 뿐만 아니라, 해당 키에 값이 존재하는지 안 하는지 즉, 사용하고 있는 key 값인지 아닌지 판별해주는 true/false 값도 반환합니다. key값이 사용되고 있다면 true를 사용되고 있지 않다면 false를 반환합니다.  그리고 존재하지 않는 key값을 입력했다면 자료형에 따라 0이나 ""이 반환됩니다.

쉽게 말해, 위에 예시에서 m["031"]은 "경기도"와 "true"를 반환합니다. 하지만 이 용법에는 몇 가지 주의할 점이 있습니다.

  1. 콘솔 출력 함수에 "맵이름[key]"을 바로 입력할 때는 key 값에 해당되는 value 값만 출력됩니다. 
  2. value 값과 true/false 값을 반환받기 위해서는 변수 두 개를 선언한 후에 각각 할당받아야 합니다. 예를 들어 val, exist := 맵이름[key]형식으로 입력해야만 val에는 value 값이, exist에는 true/false 값이 초기화됩니다.
  3. value 값만 반환받고 싶다면 변수 한 개만 선언해 할당받으면 됩니다. 예를 들어 val := 맵이름[key]형식으로 입력하면 val에 value 값이 초기화됩니다. 꼭 두 개의 값을 반환하는 것은 아닙니다.
  4. true/false 값만 반환받고 싶다면 "_, bool변수"형식으로 선언해 할당받으면 됩니다. 예를 들어 _, exist := 맵이름[key]형식으로 입력하면 exist에 true/false 값이 초기화됩니다. 왜냐하면 '맵이름[key]'는 꼭 'value, true/false' 순서로 반환하기 때문입니다. 따라서 앞에 value 값을 받는 인자를 '_,' 용법을 써 생략한다면 true/false 값만 반환받을 수 있는 것입니다. 


아래 예시 코드를 바로 실행해보세요.

실행 언어: go
실행 결과를 확인해보세요!
질문하기
추가 자료
no files uploaded

추가 자료가 없습니다

여기서 새로운 학습 자료를 확인하세요!
선생님이 추가한 자료들을 바로 확인할 수 있어요.