IMCAT.DEV
로그인 가입
Go 중급 자료구조

Go 컬렉션 (Collections)

Go 컬렉션 (Collections) — 중급

컬렉션 (Collections)

1. 도입 (왜 배워야 하는가)

컬렉션은 데이터를 구조적으로 저장하고 관리하기 위한 필수적인 도구입니다. 현실 세계에서 다양한 데이터를 효율적으로 다루려면, 이를 적절한 형태로 구성하는 것이 매우 중요합니다. 예를 들어, 쇼핑몰에서는 상품 목록, 장바구니, 사용자 정보를 관리해야 하며, 각 데이터는 여러 개의 항목으로 구성될 수 있습니다.

컬렉션을 사용하지 않으면 데이터가 무질서하게 흩어져 관리하기 어려워지며, 이는 성능 저하와 버그 발생으로 이어질 수 있습니다. 따라서 컬렉션의 사용법을 이해하고 활용하는 것은 실무에서 필수적입니다.

2. 핵심 개념 설명

Go 언어에서의 컬렉션은 주로 배열, 슬라이스, 맵, 채널을 포함합니다. 이들 각각은 데이터의 저장과 관리 방식에서 차별화된 특성을 가지고 있습니다.

용어정의
배열고정된 크기의 데이터 집합
슬라이스가변 크기의 데이터 집합
맵키-값 쌍으로 데이터를 저장하는 구조
채널고루틴 간의 데이터 통신을 위한 구조

비유

  • 배열: 정해진 크기의 서랍장. 서랍이 정해져 있으므로 더 이상 추가할 수 없다.
  • 슬라이스: 늘어나는 책꽂이. 필요할 때마다 책을 추가할 수 있다.
  • 맵: 전화번호부. 사람의 이름(키)과 전화번호(값)가 쌍으로 저장된다.
  • 채널: 우편함. 한 사람이 편지를 넣으면 다른 사람이 그것을 받을 수 있다.
  • 3. 기본 코드 예제

    다음은 Go 언어에서 슬라이스를 사용하여 간단한 숫자 목록을 관리하는 예제입니다.

    package main
    
    import "fmt"
    
    func main() {
    	// 슬라이스 생성
    	numbers := []int{1, 2, 3, 4, 5} // 정수형 슬라이스 생성
    
    	// 슬라이스에 값 추가
    	numbers = append(numbers, 6) // 6을 슬라이스에 추가
    
    	// 슬라이스 출력
    	for i, num := range numbers {
    		fmt.Printf("Index: %d, Value: %d\n", i, num) // 각 인덱스와 값을 출력
    	}
    }

    실행 결과

    Index: 0, Value: 1
    Index: 1, Value: 2
    Index: 2, Value: 3
    Index: 3, Value: 4
    Index: 4, Value: 5
    Index: 5, Value: 6

    코드 한 줄씩 동작 설명

    1. package main: 메인 패키지를 정의합니다.
    2. import "fmt": fmt 패키지를 가져와서 출력 기능을 사용할 수 있게 합니다.
    3. numbers := []int{1, 2, 3, 4, 5}: 정수형 슬라이스를 생성하고 초기화합니다.
    4. numbers = append(numbers, 6): 슬라이스에 6을 추가합니다.
    5. for i, num := range numbers: 슬라이스의 각 요소를 반복합니다.
    6. fmt.Printf(...): 각 인덱스와 값을 출력합니다.
    7. 4. 실전 활용 예제

      예제 1: 쇼핑몰에서 장바구니 구현

      장바구니에 담긴 상품 목록을 관리하는 코드입니다.

      package main
      
      import "fmt"
      
      func main() {
      	shoppingCart := map[string]int{
      		"사과": 2,
      		"바나나": 5,
      	}
      
      	// 상품 추가
      	shoppingCart["오렌지"] = 3
      
      	// 장바구니 출력
      	for item, quantity := range shoppingCart {
      		fmt.Printf("%s: %d개\n", item, quantity)
      	}
      }

      실행 결과

      사과: 2개
      바나나: 5개
      오렌지: 3개

      예제 2: 사용자 정보 관리

      사용자 정보를 맵을 통해 관리하는 예제입니다.

      package main
      
      import "fmt"
      
      func main() {
      	user := map[string]string{
      		"username": "john_doe",
      		"email":    "[email protected]",
      	}
      
      	// 사용자 정보 출력
      	for key, value := range user {
      		fmt.Printf("%s: %s\n", key, value)
      	}
      }

      실행 결과

      username: john_doe
      email: [email protected]

      5. 흔한 실수와 주의사항

      1. 슬라이스 길이 변경 시 주의

      슬라이스의 길이를 변경할 때, 원래 슬라이스의 길이를 초과할 수 있습니다.

      잘못된 코드

      numbers := []int{1, 2, 3}
      numbers[5] = 6 // 런타임 에러 발생

      올바른 코드

      numbers := []int{1, 2, 3}
      numbers = append(numbers, 6) // 안전하게 추가

      2. 맵 사용 시 nil 체크

      맵을 사용하기 전에 초기화하지 않으면 nil 에러가 발생할 수 있습니다.

      잘못된 코드

      var user map[string]string
      user["username"] = "john_doe" // 런타임 에러 발생

      올바른 코드

      user := make(map[string]string)
      user["username"] = "john_doe" // 정상 동작

      6. 정리

    8. Go 언어의 컬렉션은 배열, 슬라이스, 맵, 채널로 구성되어 있습니다.
    9. 슬라이스는 가변 크기의 데이터 집합으로, 필요에 따라 동적으로 크기를 조정할 수 있습니다.
    10. 맵은 키-값 쌍으로 데이터를 저장하며, 빠른 검색에 유리합니다.
    11. 실무에서 컬렉션을 사용하여 데이터 구조를 관리하는 것은 필수적입니다.

다음에 학습하면 좋은 주제는 고루틴과 채널입니다. 이를 통해 Go 언어의 동시성을 이해하고 활용할 수 있습니다.