티스토리 뷰

귀요미 Go 

이번에는 Map에 대해 알아봅시다 !

 

타 언어

ex) java 같은 경우에는 hash, linked ... 기타 등등 Map이 존재한다.

역시 Go 에서도 Map을 pakage에서 제공한다 !

살펴보자

| MAP

특징

-Hashtable, 딕셔너리(파이썬), Key - Value 로 자료 저장

-레퍼런스 타입(참조 값 전달)이다.

-비교 연사자 사용 불가능 ( 참조 Type 이므로)

-참조 Type(key)로 사용 불가능, 값(Value)으로 모든 타입 사용가능하다.

-make 함수 및 축약(리터럴)로 초기화 가능

-순서 없음 ( 주의 실행할 때 마다 값이 바뀝니다,)

 

문법

//기본 값 key : string(""), value : int (0)
var map1 map[string]int = make(map[string]int)
var map2 = make(map[string]int) //자료형 생략
map3 := make(map[string]int)  //리터럴

fmt.Println(map1)
fmt.Println(map2)
fmt.Println(map3)
    
//결과 : map[] 으로 동일합니다 



map4 := map[string]int{} //Json 형태
map4["apple"] = 25
map4["banana"] = 40
map4["orange"] = 33

fmt.Println(map4)

map5 := map[string]int{
		"apple":  25,
		"banana": 40,
		"orange": 33,
	}
fmt.Println(map5)

map6 := make(map[string]int, 10)
map6["apple"] = 25
map6["banana"] = 40
map6["orange"] = 33

fmt.Println("map6", map6)


//결과는 모두 [apple:25, banana:40, orange :33] 으로 동일합니다.

 

주의할 점

 

실행할 때 마다 결과값이 바뀌게 됩니다.

값이라기보단 순서가 바뀌게 됩니다.

 

 

| 반복문

package main

import "fmt"

func main() {
	map1 := map[string]string{
		"daum":   "http://daum.net",
		"naver":  "http://naver.com",
		"google": "http://google.com",
	}

	//순서 없으므로 랜덤
	for i, v := range map1 {
		fmt.Println("i:", i, "와 v:", v)
	}
}

위 코드처럼 Map은 순서가 없으므로 반복문을 실행시킬 때 마다 다른 결과가 나옵니다.

 

결과

 

 

 

| 수정 삭제

package main

import "fmt"

func main() {
	map1 := map[string]string{
		"daum":  "asd",
		"naver": "fgh",
		"test":  "test123",
	}

	//추가
	map1["testAdd"] = "testAdd"

	//수정
	map1["test"] = "수정중"

	//삭제
	//해당 map, 지울 key 값
	delete(map1, "daum")

	fmt.Println("map1:", map1)

}

 

위 코드는 Map을 추가,수정,삭제 하는 코드입니다.

 

결과

이처럼 편리하게 map을 다룰 수 있습니다.

 

 

| Map 사용 시 조금 더 효율적이게 사용하는 방법

package main

import "fmt"

func main() {

	//맵(Map)
	//사용 시 주의할 점
	map1 := map[string]int{
		"apple":  15,
		"banana": 115,
		"orange": 3333,
		"lemon":  0,
	}

	value1 := map1["apple"]  // 15
     value2 := map1["lemon"]  // 0
	value3, ok := map1["kiwi"] // 0, false

	fmt.Println("ex1:", value1)
	fmt.Println("ex2:", value3)
	fmt.Println("ex3:", ok)
}

 

위 코드에서 잘 보면 value3와 ok 변수 2개를 map1에서 할당 받고 있습니다.

이렇게된다면 오류가 나야 정상일까요 ?

답은 아닙니다.

 


value2의 변수는 0을 갖고 있습니다.

근데 value3는요 ? value3 역시 0을 return 받고있습니다.

 

여기서 어떤 기준으로 0과 false를 return하는지 궁금하시지 않나요 ?

 

그 기준은

0은 map1 := map[string]int 요기서 value type으로 선정합니다.

 

그럼 int 의 초기값은 0이죠 ? 그래서 0을 return해줍니다.

 

뒤어 boolean값은 값이 존재하는지 안 하는지의 여부를 return 해줍니다.

 

( 꼭 없는 값에만 ok 변수로 return 받는 것이 아닌, 존재하는 key 값에도 변수를 할당 받을 수 있습니다.
그렇게 되면 false가 아닌 true값이 return 되겠죠 ?)

 

 

이렇게 작성하는 이유는 Map안에 key값이 존재하는지의 여부와 if문의 분기 처리에서 코드 가독성이 올라갑니다.

//Key의 존재 유무에 따라 value와 ok 값을 return 받는다.
if value, ok := map1["kiwi"]; ok {
	fmt.Println(value, "와:", ok)
} else {
	fmt.Print(value, "와", ok)
}

결과

 

 

//Key값이 존재하지 않는다면,
if _, ok := map1["kiwi"]; !ok {
	fmt.Println("존재하지 않는 키입니다.")
}

결과

'golang' 카테고리의 다른 글

[golang]Go언어 구조체란?  (0) 2021.07.18
[golang]Go언어 포인터(pointer)란  (0) 2021.07.05
[golang]고언어 정렬(sort)과 복사(copy)  (0) 2021.07.04
[golang]슬라이스(slice)란?  (0) 2021.07.04
[golang]Golang 배열(Array) 다루기  (0) 2021.07.04