Back-End/Go

[GO] 5장 배열과 슬라이스

Tinkies 2025. 2. 28. 02:02

 

Go 언어에서 배열과 슬라이스는 중요한 데이터 구조입니다. 이 두가지는 서로 다르게 동작해, 각각의 특성과 사용 용도를 이해할 수 있습니다.


1. 배열(Array)

  • 정적 크기: 배열은 선언 시 크기가 고정되며, 이후 크기를 변경할 수 있음
  • 메모리 할당: 배열은 연속된 메모리 블록에 할당
  • 값 타입: 배열은 값 타입으로, 배열은 다른 변수에 할당하면 복사가 이루어짐
package main

import "fmt"

func main() {
	var arr[6]int // 크기가 6일 배열 선언
	arr[0] = 1
	arr[1] = 2
	fmt.Println(arr) // [1,2,0,0,0,0]
}

2. 슬라이스 (Slice)

  • 동적 크기: 슬라이스는 동적으로 크기를 조정할 수 있으며, 배열에 대한 레퍼런스
  • 메모리 할당: 슬라이스는 내부적으로 배열을 참조해, 길이와 용량을 가짐
  • 참조 타입: 슬라이스는 참조 타입으로, 슬라이스를 다른 변수에 할당하면 같은 배열을 참조
package main

import "fmt"

func main() {
	slice := []int{1,2,3} // 슬라이스 선언
	fmt.Println(slice); // [1,2,3]

	slice = append(slice, 4); // 슬라이스에 값 추가
	fmt.Println(slice) // [1 2 3 4]
}

3. 배열과 슬라이스의 차이점 

특성 배열 슬라이스
크기 고정 크기 동적 크기
타입 값 타입 참조 타입
메모리 할당 연속된 메모리 블록 내부 배열을 참조
할당 방법 var arr [5]int slice := [ ] int { } 또는 make 
기본값 0으로 초기화 null로 초기화

4. 슬라이스를 사용한 동적 배열 처리

슬라이스는 Go에서 동적 배열을 처리하는 데 유용합니다. 슬라이스는 append 함수를 사용해 요소를 추가할 수 있으며, 필요에 따라 크기를 자동으로 조정합니다.

package main

import "fmt"

func main() {
	var dynamicSlice []int // 슬라인스 선언 (nil 상태)

	// 슬라이스에 값 추가
	for i := 0; i < 10; i++ {
		dynamicSlice = append(dynamicSlice, i)
	}

	fmt.Println(dynamicSlice); // [0 1 2 3 4 5 6 7 8 9]

	// 슬라이스의 길이와 용량
	fmt.Println("Length:", len(dynamicSlice)) // Length: 10
	fmt.Println("Capacity:", len(dynamicSlice)) // Capacity: 10 (초기 용량)
}

5. 슬라이스의 용량 증가

슬라이스의 크기를 초과하여 요소를 추가할 경우, Go에는 새로운 배열을 할당하고 기존 데이터를 복사합니다. 이는 성능에 영향을 미칠 수 있으며, 예상되는 용량을 미리 지정하는 것이 좋습니다.

package main

import "fmt"

func main() {
	// 초기 용량을 5로 설정
	slice := make([]int, 0, 5)

	for i := 0; i < 10; i++ {
		slice = append(slice, i)
		fmt.Printf("Length: %d, Capacity: %d\n", len(slice), cap(slice))
	}
}

요약

  • 배열: 고정 크기, 값 타입, 메모리에서 연속적으로 할당
  • 슬라이스: 동적 크기, 참조 타입, 배열을 참조하여 유연한 데이터 구조 제공
  • 슬라이스 사용: append 함수를 통해 동적으로 요소를 추가할 수 있으며, 필요에 따라 메모리에서 새 배열 할당

 

 

GitHub - Koras02/Go-Bloging: https://thinky.tistory.com/category/Back-End/Go

https://thinky.tistory.com/category/Back-End/Go. Contribute to Koras02/Go-Bloging development by creating an account on GitHub.

github.com

 

LIST