본문 바로가기
프로그래밍

👨‍💻 [Go] Go 에서 slice 란 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2025. 1. 6.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 slice 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

Go 에서 slice 란 무엇이며, 어떻게 활용할 수 있나요?

답변 >

Go에서 슬라이스(Slice)는 배열과 유사한 데이터 구조로, 동적 크기 조정이 가능하고, 배열보다 더 유연하게 사용됩니다. 슬라이스는 배열의 부분 집합을 참조하며, 실제 데이터는 기저 배열(underlying array)에 저장됩니다.

슬라이스는 고정 크기의 배열보다 훨씬 더 자주 사용되며, 특히 크기가 동적으로 변경될 수 있는 데이터를 처리할 때 유용합니다.


슬라이스의 기본 특징

  1. 동적 크기: 슬라이스의 크기는 필요에 따라 늘어나거나 줄어들 수 있습니다.
  2. 참조 타입: 슬라이스는 배열의 데이터를 참조하므로, 복사본이 아닌 공유된 데이터를 다룹니다.
  3. 세 가지 주요 속성:
    • 길이(len): 슬라이스에 포함된 요소의 개수
    • 용량(cap): 슬라이스의 기저 배열에서 시작 위치부터 끝까지의 총 요소 개수
  4. 제로 값: nil이며, 길이와 용량이 0입니다.

슬라이스 선언 및 초기화

1. 기본 선언

var s []int // nil 슬라이스

2. 초기화와 사용

s := []int{1, 2, 3, 4}
fmt.Println(s) // [1 2 3 4]

3. 배열로부터 슬라이스 생성

arr := [5]int{1, 2, 3, 4, 5}
s := arr[1:4] // 2번째 요소부터 4번째 요소까지 (1-based, 4는 제외)
fmt.Println(s) // [2 3 4]

4. make 함수로 슬라이스 생성

s := make([]int, 5)       // 길이 5, 용량 5
s2 := make([]int, 5, 10)  // 길이 5, 용량 10


슬라이스 사용법

1. 기본 접근 및 수정

s := []int{10, 20, 30}
fmt.Println(s[1]) // 20
s[1] = 25
fmt.Println(s)    // [10 25 30]

2. 슬라이싱

s := []int{1, 2, 3, 4, 5}
fmt.Println(s[:3])  // [1 2 3]
fmt.Println(s[2:])  // [3 4 5]
fmt.Println(s[1:4]) // [2 3 4]

3. 길이와 용량 확인

s := []int{1, 2, 3}
fmt.Println(len(s)) // 3
fmt.Println(cap(s)) // 3

4. 슬라이스에 요소 추가

슬라이스에 요소를 추가할 때는 append 함수를 사용합니다.

s := []int{1, 2, 3}
s = append(s, 4, 5)
fmt.Println(s) // [1 2 3 4 5]


슬라이스와 용량 관리

슬라이스의 용량이 초과되면, Go는 자동으로 기저 배열을 확장하고 새 배열을 할당합니다. 이는 성능에 영향을 미칠 수 있으므로 필요에 따라 용량을 사전에 설정하거나 관리해야 합니다.

용량 확장 예제

s := []int{1, 2}
fmt.Println(len(s), cap(s)) // 2, 2

s = append(s, 3) // 용량 초과 발생
fmt.Println(len(s), cap(s)) // 3, 4 (용량이 두 배로 증가)


슬라이스 복사

copy 함수를 사용하여 슬라이스를 복사할 수 있습니다.

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src)
fmt.Println(dst) // [1 2 3]


슬라이스 활용 예제

1. 슬라이스 정렬

Go 표준 라이브러리의 sort 패키지를 사용하여 슬라이스를 정렬할 수 있습니다.

package main

import (
    "fmt"
    "sort"
)

func main() {
    nums := []int{5, 2, 8, 3}
    sort.Ints(nums)
    fmt.Println(nums) // [2 3 5 8]
}

2. 슬라이스 필터링

package main

import "fmt"

func filter(s []int, f func(int) bool) []int {
    var result []int
    for _, v := range s {
        if f(v) {
            result = append(result, v)
        }
    }
    return result
}

func main() {
    nums := []int{1, 2, 3, 4, 5}
    evens := filter(nums, func(n int) bool { return n%2 == 0 })
    fmt.Println(evens) // [2 4]
}

3. 슬라이스 병합

package main

import "fmt"

func main() {
    a := []int{1, 2}
    b := []int{3, 4}
    merged := append(a, b...)
    fmt.Println(merged) // [1 2 3 4]
}


슬라이스의 장점

  • 동적 크기 조정: 배열과 달리 크기가 유연하게 변경됩니다.
  • 편리한 함수: append, copy, sort 등 슬라이스를 쉽게 조작할 수 있는 함수가 제공됩니다.
  • 효율성: 슬라이스는 기저 배열을 참조하므로, 메모리 사용량이 효율적입니다.

슬라이스의 주의사항

  • 기저 배열 공유: 여러 슬라이스가 동일한 배열을 참조할 수 있어, 한 슬라이스를 변경하면 다른 슬라이스에 영향을 줄 수 있습니다.
arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[:3]
s2 := arr[2:]
s1[2] = 100
fmt.Println(s2) // [100 4 5]

  • 용량 초과 관리: 용량이 초과될 경우 새로운 배열이 할당되므로, 성능에 영향을 줄 수 있습니다.
  • 슬라이스 초기화: nil 슬라이스와 길이가 0인 슬라이스는 다릅니다.
var s1 []int     // nil 슬라이스
s2 := []int{}    // 길이가 0인 슬라이스
fmt.Println(s1 == nil) // true
fmt.Println(s2 == nil) // false


Go의 슬라이스는 배열보다 훨씬 유연하고 강력하며, 데이터를 동적으로 관리하는 데 매우 적합합니다. 적절히 활용하면 코드의 가독성과 성능을 모두 향상시킬 수 있습니다.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형