배열(Array)
배열은 고정된 크기의 연속적인 메모리 공간에 동일 타입의 데이터를 순서대로 저장하는 데이터 구조이다. Go에서 배열을 선언할 때는 그 크기와 저장될 데이터의 타입을 명시해야 한다. 배열의 크기는 타입의 일부로 간주되므로, 크기가 다른 배열은 다른 타입으로 간주된다.
특징
- 정적 크기: 배열의 크기는 컴파일 시간에 결정되며, 실행 시간 동안 변경할 수 없다.
- 값 타입(Value Type): 배열은 값 타입이기 때문에, 배열을 다른 변수에 할당하거나 함수에 인자로 전달할 때마다 배열의 내용이 전체적으로 복사된다.
- 크기가 타입의 일부: Go에서는 배열의 크기가 그 타입의 일부로 간주된다. 예를 들어,
[5]int
와 [10]int
는 서로 다른 타입이다.
예시
package main
import "fmt"
func main() {
a := [5]int{1, 2, 3, 4, 5}
b := a
b[0] = 10
fmt.Println(a)
fmt.Println(b)
}
슬라이스(Slice)
슬라이스는 배열에 비해 더 유연한 구조로, 크기가 동적으로 변할 수 있다. 슬라이스는 내부적으로 배열을 참조하며, 이 배열의 일부분 또는 전체를 나타낼 수 있다. 슬라이스는 길이(length)와 용량(capacity)을 가지며, append 함수를 사용해 동적으로 요소를 추가할 수 있다.
특징
- 동적 크기: 슬라이스는 필요에 따라 크기가 확장되거나 축소될 수 있다. append 함수를 사용하여 새로운 요소를 추가할 수 있으며, 이때 필요하면 내부적으로 더 큰 배열로 이전된다.
- 참조 타입(Reference Type): 슬라이스는 참조 타입이며, 슬라이스 변수는 내부 배열의 부분 또는 전체를 가리키는 포인터를 담고 있다. 슬라이스를 다른 변수에 할당하거나 함수에 전달하면, 참조(포인터)가 복사된다.
- 내부 구조: 슬라이스는 포인터, 길이(length), 그리고 용량(capacity)의 세 가지 필드로 구성된 구조체이다. 포인터는 슬라이스가 참조하는 배열의 시작을 가리킨다.
예시
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4, 5}
b := a
b[0] = 10
fmt.Println(a)
fmt.Println(b)
}
차이점
- 크기 변경 가능성: 배열은 선언 시점에 크기가 고정되지만, 슬라이스는 append와 같은 함수를 사용하여 동적으로 크기를 변경할 수 있다.
- 값 타입 vs 참조 타입: 배열은 값 타입으로, 배열을 다른 변수에 할당하면 전체 배열이 복사된다. 반면, 슬라이스는 참조 타입으로, 슬라이스를 다른 변수에 할당하면 내부 배열에 대한 참조만 복사된다.
- 용도와 사용법: 배열은 정적인 데이터 세트를 다룰 때 유용하며, 슬라이스는 데이터 세트의 크기가 실행 시간에 변할 수 있을 때 더 적합하다.