Golang 이해: Array vs. Slice
Ethan Miller
Product Engineer · Leapcell

Key Takeaways
- Go에서 배열은 고정 크기를 갖는 반면, 슬라이스는 동적이고 유연합니다.
- 슬라이스는 참조 유형이므로 배열보다 메모리 효율성이 더 높습니다.
- 슬라이스는 데이터 복사 없이 강력한 데이터 조작 기능을 제공합니다.
Go에서 배열과 슬라이스는 요소의 시퀀스를 저장하는 데 사용되는 기본적인 데이터 구조입니다. 겉보기에는 비슷해 보일 수 있지만, 개발자가 이해해야 할 뚜렷한 특징과 동작이 있습니다.
Go의 배열
Go에서 배열은 동일한 유형의 요소로 구성된 고정 크기의 시퀀스입니다. 배열이 선언되면 크기를 변경할 수 없습니다. 배열을 선언하는 구문에는 크기를 지정하는 것이 포함됩니다.
var arr [5]int
이 예에서 arr
은 5개의 정수 배열입니다. 배열은 Go에서 값 유형이므로, 하나의 배열을 다른 배열에 할당하면 모든 요소가 복사됩니다. 마찬가지로 배열을 함수에 전달하면 전체 배열이 복사됩니다. 이 동작은 특히 큰 배열에서 성능에 영향을 줄 수 있습니다.
Go의 슬라이스
슬라이스는 기본 배열에 대한 창을 제공하는 더 유연하고 동적인 데이터 구조입니다. 슬라이스는 참조하는 데이터를 소유하지 않습니다. 대신 배열의 세그먼트를 설명합니다. 슬라이스를 선언하는 구문은 다음과 같습니다.
var s []int
슬라이스에는 세 가지 구성 요소가 있습니다.
- 포인터: 기본 배열의 주소를 참조합니다.
- 길이: 슬라이스의 요소 수입니다.
- 용량: 슬라이스의 첫 번째 요소부터 시작하는 기본 배열의 요소 수입니다.
배열과 달리 슬라이스는 참조 유형입니다. 하나의 슬라이스를 다른 슬라이스에 할당하거나 슬라이스를 함수에 전달해도 기본 데이터가 복사되지 않습니다. 두 슬라이스 모두 동일한 배열 세그먼트를 참조합니다. 이 동작은 슬라이스를 동적 데이터 조작에 더 효율적이고 다재다능하게 만들어 줍니다.
슬라이스 생성
슬라이스는 여러 가지 방법으로 만들 수 있습니다.
-
기존 배열 또는 슬라이스에서:
a := [5]int{1, 2, 3, 4, 5} s := a[1:4] // s == []int{2, 3, 4}
-
make
함수 사용:s := make([]int, 5, 10)
이렇게 하면 길이가 5이고 용량이 10인 슬라이스가 생성됩니다.
-
슬라이스 리터럴:
s := []int{1, 2, 3}
이렇게 하면 길이와 용량이 3인 슬라이스가 생성됩니다.
배열과 슬라이스의 차이점
-
크기: 배열은 컴파일 시간에 정의된 고정 크기를 갖는 반면, 슬라이스는 동적이며 필요에 따라 늘리거나 줄일 수 있습니다.
-
유형: 배열의 크기는 해당 유형의 일부입니다(
[3]int
는[4]int
와 다름). 따라서 배열의 유연성이 떨어집니다. 그러나 슬라이스는 해당 유형에 크기를 포함하지 않으므로 유연성이 향상됩니다. -
메모리 효율성: 슬라이스는 참조 유형이므로 함수에 전달될 때 슬라이스 설명자(포인터, 길이, 용량)만 전달되고 전체 데이터가 전달되지 않으므로 메모리 효율성이 더 높습니다.
-
사용 사례: 배열은 요소 수가 알려져 있고 고정되어 있을 때 적합합니다. 슬라이스는 요소의 수가 동적이거나 알 수 없는 경우에 더 적합하며, 더 많은 유연성과 기능을 제공합니다.
슬라이스의 내부 메커니즘
효율적인 Go 프로그래밍을 위해서는 슬라이스의 내부 메커니즘을 이해하는 것이 필수적입니다. 슬라이스는 기본 배열에 대한 포인터, 해당 길이 및 용량을 포함하는 설명자입니다. 배열에서 슬라이스가 생성되면 해당 배열의 세그먼트를 참조합니다.
a := [5]int{1, 2, 3, 4, 5} s := a[1:4]
여기서 s
는 배열 a
의 요소 {2, 3, 4}
를 참조합니다. s
를 수정하면 동일한 기본 데이터를 공유하므로 a
에 영향을 줍니다. s
의 용량을 초과하면(예: append
사용) 새 기본 배열이 할당될 수 있으며, 원래 배열은 변경되지 않습니다.
결론
배열과 슬라이스는 Go의 데이터 처리 기능의 기초입니다. 배열은 간단하고 고정 크기의 요소 컬렉션을 제공하는 반면, 슬라이스는 배열에 대한 동적이고 유연한 뷰를 제공하여 데이터 복사 오버헤드 없이 강력한 데이터 조작을 가능하게 합니다. 이러한 차이점과 적절한 사용 사례를 이해하는 것은 효율적이고 효과적인 Go 프로그램을 작성하는 데 매우 중요합니다.
FAQs
슬라이스는 동적 크기 조정, 더 나은 메모리 효율성 및 향상된 기능을 제공합니다.
아니요, 슬라이스는 참조 유형이므로 동일한 기본 배열을 공유합니다.
새 기본 배열이 할당되고 슬라이스는 새 메모리를 가리킵니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불하세요. 요청 수, 요금 부과가 없습니다.
타의 추종을 불허하는 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하세요.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 높은 동시성을 쉽게 처리할 수 있도록 자동 확장됩니다.
- 운영 오버헤드가 전혀 없습니다. 구축에만 집중하세요.
Documentation에서 더 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ