🔥 Map 리터럴과 값타입

290자
4분

Map을 선언할 때 지정한 값 타입이 타입명 하나로 이루어져 있다면, Map 리터럴의 요소에서 값의 타입명을 생략할 수 있습니다. 이렇게 하면 코드의 가독성이 높아지고, 타이핑 양도 줄일 수 있습니다.

하지만 값 타입이 타입명 하나로만 이루어지지 않은 경우도 있습니다. 예를 들어, Map의 값 타입이 포인터 타입이거나 배열, 슬라이스, Map 등의 복합 타입일 수 있습니다.

var m1 = map[string]*int{
    "a": new(int),
    "b": new(int),
}
 
var m2 = map[string][]string{
    "a": []string{"apple", "avocado"},
    "b": []string{"banana", "blueberry"},
}
 
go

위의 예제에서 m1의 값 타입은 *int로 포인터 타입이며, m2의 값 타입은 []string로 슬라이스 타입입니다. 이런 경우에는 Map 리터럴의 요소에서 타입명을 생략할 수 없습니다.

이제 값 타입이 타입명 하나로 이루어진 경우의 예제 코드를 살펴보겠습니다:

package main
 
import "fmt"
 
type Vertex struct {
    Lat, Long float64
}
 
var m = map[string]Vertex{
    "Bell Labs": {40.68433, -74.39967},
    "Google":    {37.42202, -122.08408},
}
 
func main() {
    fmt.Println(m)
}
 
go

위 코드에서 Vertex 구조체를 정의하고 있습니다. 이 구조체는 LatLong이라는 두 개의 float64 타입 필드를 가지고 있습니다.

type Vertex struct {
    Lat, Long float64
}
 
go

그리고 m이라는 변수를 선언하면서 Map 리터럴을 사용하고 있습니다. 이 Map은 string 타입의 키와 Vertex 타입의 값을 가지고 있습니다.

var m = map[string]Vertex{
    "Bell Labs": {40.68433, -74.39967},
    "Google":    {37.42202, -122.08408},
}
 
go

여기서 주목할 점은 Map 리터럴의 값 부분입니다. Vertex 타입을 명시하지 않고 중괄호 {}만 사용하여 LatLong 값을 직접 지정하고 있습니다. 이렇게 할 수 있는 이유는 Map의 값 타입이 Vertex로 이미 명시되어 있기 때문입니다.

마지막으로 main 함수에서는 fmt.Println(m)을 호출하여 Map m을 출력하고 있습니다.

func main() {
    fmt.Println(m)
}
 
go

이 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다:

map[Bell Labs:{40.68433 -74.39967} Google:{37.42202 -122.08408}]
text

이렇게 Map 리터럴에서 값 타입을 생략하는 기능을 활용하면 코드를 더욱 간결하고 읽기 쉽게 작성할 수 있습니다. 특히 구조체와 같이 복잡한 타입을 값으로 사용할 때 유용합니다.