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

Go 슬라이스 (Slices)

Go 슬라이스 (Slices) — 초급

슬라이스 (Slices)

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

Go 언어에서 슬라이스(Slice)는 배열(Array)보다 더 유연한 데이터 구조로, 동적으로 크기를 조절할 수 있는 특성을 가지고 있습니다. 실무에서는 데이터의 크기가 변할 수 있는 경우가 많기 때문에 슬라이스는 배열보다 훨씬 유용하게 사용됩니다. 예를 들어, 사용자로부터 입력을 받아 동적으로 리스트를 만들어야 할 때 슬라이스를 사용하지 않으면 고정된 크기의 배열로 인해 불필요한 메모리 낭비나 데이터 손실이 발생할 수 있습니다. 슬라이스를 모르면 데이터 구조를 효과적으로 관리할 수 없는 문제에 직면하게 됩니다.

2. 핵심 개념 설명

슬라이스는 배열을 기반으로 하며, 배열의 일부를 참조하는 역할을 합니다. 이 때문에 슬라이스는 배열보다 더 적은 메모리를 사용하고, 크기를 동적으로 변경할 수 있습니다. 슬라이스를 사용하는 것은 마치 "책장"과 같은 비유를 들 수 있습니다. 책장은 여러 개의 책(데이터)을 담고 있으며, 필요에 따라 책을 추가하거나 제거할 수 있습니다. 반면에 배열은 고정된 크기의 서랍으로, 처음에 넣은 책 외에는 더 이상 추가할 수 없습니다.

관련 용어 정리

용어설명
슬라이스데이터의 동적 배열로, 길이가 변할 수 있는 구조
배열고정된 크기를 가지는 데이터 구조
용량슬라이스가 할당받은 메모리의 크기
길이슬라이스에 포함된 요소의 개수

3. 기본 코드 예제

슬라이스의 기본적인 사용법을 보여주는 코드입니다.

package main

import "fmt"

func main() {
    // 슬라이스 생성
    fruits := []string{"사과", "바나나", "체리"}

    // 슬라이스에 요소 추가
    fruits = append(fruits, "망고")

    // 슬라이스 출력
    fmt.Println(fruits)
}

실행 결과

[사과 바나나 체리 망고]

코드 한 줄씩 동작 설명

  1. package main - 프로그램의 시작을 알리는 패키지를 정의합니다.
  2. import "fmt" - fmt 패키지를 가져와서 출력 기능을 사용할 수 있도록 합니다.
  3. fruits := []string{"사과", "바나나", "체리"} - 슬라이스를 생성하고 초기값을 설정합니다.
  4. fruits = append(fruits, "망고") - 슬라이스에 새로운 요소인 "망고"를 추가합니다.
  5. fmt.Println(fruits) - 최종적으로 슬라이스의 내용을 출력합니다.
  6. 4. 실전 활용 예제

  7. 쇼핑몰에서 장바구니를 구현할 때
  8. 슬라이스는 사용자가 선택한 상품 목록을 저장하는 데 유용합니다. 장바구니에 추가된 상품이 많아지거나 줄어들 수 있기 때문에 슬라이스로 구현하면 동적으로 관리할 수 있습니다.

       package main
    
       import "fmt"
    
       func main() {
           cart := []string{"티셔츠", "바지"}
           cart = append(cart, "신발") // 신발 추가
           fmt.Println("장바구니:", cart)
       }
  9. 피드백 수집 시스템
  10. 사용자로부터 피드백을 수집할 때 슬라이스를 사용하여 동적으로 피드백을 추가할 수 있습니다.

       package main
    
       import "fmt"
    
       func main() {
           feedbacks := []string{}
           feedbacks = append(feedbacks, "좋아요!") // 첫 번째 피드백 추가
           feedbacks = append(feedbacks, "아쉬워요.") // 두 번째 피드백 추가
           fmt.Println("피드백 목록:", feedbacks)
       }

    5. 흔한 실수와 주의사항

  11. 슬라이스 길이와 용량 혼동하기
  12. 슬라이스의 길이(len)와 용량(cap)을 혼동하여 사용하는 경우가 많습니다.

    잘못된 코드

       fruits := []string{"사과", "바나나"}
       fmt.Println(len(fruits)) // 2
       fmt.Println(cap(fruits)) // 슬라이스의 용량은 2가 아닐 수 있음

    올바른 코드

       fruits := make([]string, 0, 2) // 길이는 0, 용량은 2
       fruits = append(fruits, "사과", "바나나")
       fmt.Println(len(fruits)) // 2
       fmt.Println(cap(fruits)) // 2
  13. 슬라이스를 잘못 복사하기
  14. 슬라이스를 단순히 대입할 경우 참조가 복사되어 원본이 변경될 수 있습니다.

    잘못된 코드

       a := []string{"사과", "바나나"}
       b := a
       b[0] = "체리" // a도 영향을 받음

    올바른 코드

       a := []string{"사과", "바나나"}
       b := make([]string, len(a))
       copy(b, a) // 슬라이스를 깊은 복사
       b[0] = "체리" // a는 영향을 받지 않음

    6. 정리

    • 슬라이스는 배열보다 유연하고 동적으로 크기를 조절할 수 있는 데이터 구조입니다.
    • 슬라이스를 사용하면 메모리를 효율적으로 관리하고, 동적으로 데이터를 추가하거나 제거할 수 있습니다.
    • 길이(len)와 용량(cap)을 혼동하지 않도록 주의해야 하며, 슬라이스를 복사할 때는 깊은 복사를 고려해야 합니다.

다음에는 맵(Map)이라는 Go의 또 다른 유용한 데이터 구조에 대해 학습해보는 것을 추천합니다. 맵은 키-값 쌍으로 데이터를 저장하여 빠른 조회가 가능합니다.