Computer_Language/GO

[Go] 8. Go(golang)의 맵(map)

Joo-Topia 2019. 10. 7. 16:56

오늘 정리할 내용은 맵(map)에 대한 내용이다.

맵은 슬라이스와 마찬가지로 참조 타입이다. 문법도 슬라이스와 유사하여 쉽게 공부할 수 있었다.

 

Go언어의 맵 기본 문법


Go언어의 맵은 Python언어의 딕셔너리와 매우 유사하다. nil map이라는 개념이 있다는 것이 유일한 차이점인 것 같다.

코드를 통해 nil map을 선언해보고, 선언과 동시에 초기화도 해보자.

package main

import "fmt"

func main() {
    var dict1 map[string]string

    if dict1 == nil {
        fmt.Println("this is nil map")
    }

    dict2 := map[string]string{
        "name":  "주성민",
        "age":   "25",
        "birth": "950906",
    }

    fmt.Printf("%s의 나이는 %s이고 생년월일은 %s 이다.\n", dict2["name"], dict2["age"], dict2["birth"])
    fmt.Printf("현재 dict2의 길이는 %d 이다.\n", len(dict2))
    fmt.Println(dict2)
}

결과

"var dict1 map[string]string"는 nil map을 만드는 문법이다.
선언과 동시에 초기화하는 경우는 nil map이 아닌 데이터가 존재하는 map이 생성된다.

아래 코드처럼 nil map이 초기화된 map을 참조하게 할 수도 있다.

dict1 = dict2
fmt.Println(dict1)

결과는 직접 확인해보자!

 

슬라이스의 make 함수 처럼 맵 컬렉션에 메모리를 할당할 수 있다.

package main

import "fmt"

func main() {
    var dict3 = make(map[int]string)
    dict3[1] = "일"
    dict3[5] = "오"
    fmt.Println(dict3)
}

nil map이 아니기 때문에 할당된 메모리 영역에 key와 value를 정의할 수 있다.

이미 정의된 key, value가 있다면 key에 해당하는 새로운 value값으로 재정의도 가능하다.

 

Go언어 map의 key값 확인


시작하기에 앞서 이 문법은 정말정말정말 중요하다고 말하고 싶다.

나는 정말 별거아닌 줄 알고 대충 보고 넘겼었는데, 이번에 Go언어로 Open Source Project를 진행하다가 알게 되었다.

실제 프로젝트에 기여했던 코드 중 일부를 변형한 코드이다.

package main

import "fmt"

func main() {
    var dict3 = make(map[int]string)
    dict3[1] = "일"
    dict3[5] = "오"
    fmt.Println(dict3)

    switch word, ok := dict3[1]; ok {
    case true:
        fmt.Printf("key에 해당하는 값은 %s 입니다.\n", word)
    default:
        fmt.Println("key에 해당하는 값이 없습니다.")
    }

    switch word, ok := dict3[10]; ok {
    case true:
        fmt.Printf("key에 해당하는 값은 %s 입니다.\n", word)
    default:
        fmt.Println("key에 해당하는 값이 없습니다.")
    }
}

결과

map을 이런식으로 사용하는 데는 다음과 같은 문법이 있다.

  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 Lang 중 36강

 

마무리


짧지만 정말 많이 쓰이고 있는 Hash table인 맵에 대해 공부하였다.

파이썬에서 딕셔너리를 정말 유용하게 사용하듯이 Go에서도 유용하게 사용할 것 같다.

 

*구름 edu의 바로 실행해보면서 배우는 Go Lang"을 수강 후 정리한 내용입니다.
소스코드는 깃허브 저장소를 참고!