"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 slice 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
Go 에서 slice 란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
Go에서 슬라이스(Slice)는 배열과 유사한 데이터 구조로, 동적 크기 조정이 가능하고, 배열보다 더 유연하게 사용됩니다. 슬라이스는 배열의 부분 집합을 참조하며, 실제 데이터는 기저 배열(underlying array)에 저장됩니다.
슬라이스는 고정 크기의 배열보다 훨씬 더 자주 사용되며, 특히 크기가 동적으로 변경될 수 있는 데이터를 처리할 때 유용합니다.
슬라이스의 기본 특징
- 동적 크기: 슬라이스의 크기는 필요에 따라 늘어나거나 줄어들 수 있습니다.
- 참조 타입: 슬라이스는 배열의 데이터를 참조하므로, 복사본이 아닌 공유된 데이터를 다룹니다.
- 세 가지 주요 속성:
- 길이(len): 슬라이스에 포함된 요소의 개수
- 용량(cap): 슬라이스의 기저 배열에서 시작 위치부터 끝까지의 총 요소 개수
- 제로 값: 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
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 map 이란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.06 |
---|---|
👨💻 [Go] Go 에서 기저 배열(underlying array) 이란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.06 |
👨💻 [Go] Go 에서 제네릭 프로그래밍 이란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.03 |
👨💻 [Go] Go 에서 타입 제한 이란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |
👨💻 [Go] Go 에서 인터페이스(Interface) 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.03 |