한 눈에 끝내는 고랭 기초
    • 01
      시작하기에 앞서
    • 강의대상
      Go란?
      실습 환경 구축 - 구름IDE
      Hello goorm! 출력해보기
    • 02
      변수와 상수
    • 콘솔 출력 함수의 기본
      변수의 선언과 초기화
      상수의 선언과 초기화
      간단한 덧셈
      잘못된 신상정보
    • 03
      연산자
    • 연산자 종류
      연산자 우선순위
      콘솔 입력 함수의 기본
      간단한 덧셈과 곱셈
      몫과 나머지
    • 04
      자료형
    • 자료형의 종류와 특징
      문자열의 표현
      자료형의 변환
      강제 형 변환
    • 05
      콘솔 출력과 입력 함수
    • 콘솔 출력 함수(Print)
      콘솔 입력 함수(Scan)
      정돈된 표
      신상정보 입력과 출력
    • 06
      반복문 - for
    • 오로지 for
      구구단
      빛나는 이등변삼각형
    • 07
      조건문 - if/else
    • 조건에 따른 실행과 흐름 분기
      7과 9의 배수
      두 수의 차
    • 08
      분기문 - switch
    • swich문에 의한 선택적 실행
      안좋은 계산기
    • 09
      제어문
    • break, continue, goto문
      구구단2
      두 수를 더하면 99
    • 10
      컬렉션
    • 배열(Array)
      슬라이스(Slice)
      맵(Map)
      역행렬
      가장 긴 이름
      중간고사 평균 점수
    • 11
      함수
    • Go언어에서의 함수
      전역변수와 지역변수
      매개변수
      반환값(리턴값)
      익명 함수
      오름차순 정렬
      아이패드를 사주는 조건
      역학적 에너지
    • 12
      클로저
    • 외부 변수 접근 : 클로저
      동전 정리
    • 13
      구조체와 메소드
    • 구조체
      메소드
      성적 저장 프로그램
      역학적 에너지2
    • 14
      인터페이스(interface)
    • 메소드의 집합 인터페이스
      직육면체와 원기둥
    • 15
      defer와 panic()
    • 지연 처리 defer
      종료하는 panic(), 복구하는 recover()
      엘리베이터
      중간고사 평균 점수2
    • 16
      에러 처리
    • 에러 처리의 기본
      에러 출력 및 처리
      중간고사 평균 점수3
    • 17
      고루틴(Goroutine)
    • 비동기 프로세스의 기본
      고루틴의 활용
      고루틴 실습
    • 18
      채널(Channel)
    • 고루틴의 데이터 통로 : 채널
      비동기 채널과 버퍼
      동기 채널
      채널 닫기
      송신 전용, 수신 전용 채널
      채널 select문
      고루틴 실습2
      메시지 전송
      동기 채널 실습
      비동기 채널 실습
    • 19
      패키지(package)
    • 패키지의 개념
    • 20
      실전 프로젝트 - 마일리지 상점
    • 프로젝트를 시작하기 앞서
      실습모드에서 실습
      마일리지 상점의 주요 기능
      필수 구조체와 매인 메뉴
      잔여 수량, 잔여 포인트 구현
    • 21
      실전 프로젝트 - 주문하기, 장바구니 담기
    • 구매 구현(1)
      구매 구현(2)
      장바구니에 담기
      장바구니 확인(1)
      장바구니 확인(2)
    • 22
      실전 프로젝트 - 고루틴으로 배송하기
    • 배송 상태 확인(1)
      배송 상태 확인(2)
      배송 상태 확인(3)
      최종 코드
    맵(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
    실행 결과를 확인해보세요!
    질문하기