[Golang] 컬렉션 - slice 개념 및 사용법

sue·2024년 4월 1일

Golang

목록 보기
2/2
post-thumbnail

Go의 slice는 배열의 기초하여 만들어졌지만, 배열과는 다르게 동적으로 크기가 증가할 수 있고, 배열의 일부분을 참조할 수 있다.

기본 문법

  • slice 생성 방법
    1. 선언과 동시에 리터럴값 지정
    2. make() 함수를 사용하여 길이(Length)와 용량(Capacity)을 임의로 지정
// slice 생성
slice1 := []int{1, 2, 3}
slice2 := make([]int, 3, 5) // 길이 3, 용량 5인 slice 생성

특징

  1. 가변적
  • 요소를 추가하면 길이가 동적으로 늘어남
  • append() 함수를 사용하여 요소를 추가함
func main() {
    s := []int{0, 1}
 
    // 하나 확장
    s = append(s, 2)       // 0, 1, 2
    // 복수 요소들 확장
    s = append(s, 3, 4, 5) // 0,1,2,3,4,5
 
    fmt.Println(s)
}
  • 주의할 점
    append를 할 때 기존 slice의 용량(capacity)를 초과하면 새로운 underlying array를 할당받게 됨. 이 경우 기존 slice의 주소값이 변경되므로 주의.
  • 아래와 같이 미리 공간을 확보해두면 주소값 변경없이 값을 대입할 수 있음
slice := make([]int, 0, 10) // 길이 0, 용량 10인 slice 생성
fmt.Printf("%p\n", &slice[0]) // 초기 주소값 출력

slice = append(slice, 1, 2, 3) // 값 추가
fmt.Printf("%p\n", &slice[0]) // 주소값 동일

slice[3] = 4 // 인덱싱으로 직접 값 대입
slice[4] = 5
fmt.Println(slice) // [1 2 3 4 5]
fmt.Printf("%p\n", &slice[0]) // 주소값 동일
  1. 참조 타입
  • slice는 참조 타입이기 때문에 slice를 복사하면 두 slice가 동일한 underlying array를 가리킴
package main

import "fmt"

func main() {
	// 슬라이스 생성
	slice1 := []int{1, 2, 3, 4, 5}

	// 슬라이스 복사
	slice2 := slice1

	// 원본 슬라이스 값 변경
	slice1[1] = 200

	fmt.Println("slice1: ", slice1) // slice1:  [1 200 3 4 5]
	fmt.Println("slice2: ", slice2) // slice2:  [1 200 3 4 5]

	// 슬라이스 주소 확인
	fmt.Printf("slice1 주소: %p\n", &slice1[0]) // slice1 주소: 0xc00008e180
	fmt.Printf("slice2 주소: %p\n", &slice2[0]) // slice2 주소: 0xc00008e180
}
  1. 세 가지 인덱스
  • slice는 pointer, length, capacity 세 가지 인덱스 값을 가짐
  • pointer는 slice의 시작 위치, length는 slice의 길이, capacity는 slice가 자랄 수 있는 최대 크기임
  1. 슬라이싱 연산
  • Go 언어에서 슬라이싱 연산은 배열이나 슬라이스의 일부분을 새로운 슬라이스로 만들어내는 방법
  • 기본 문법
    • low는 새로운 슬라이스의 시작 인덱스
    • high는 새로운 슬라이스의 끝 인덱스. 단, high 인덱스의 값은 새로운 슬라이스에 포함되지 않음.
      • slice[포함부터 : 전까지]
    • max는 새로운 슬라이스의 최대 용량(capacity). 생략 가능함.
slice[low:high:max]
arr := [5]int{1, 2, 3, 4, 5} // 배열

// 전체 슬라이싱
slice1 := arr[:] // [1 2 3 4 5]

// 부분 슬라이싱
slice2 := arr[1:3] // [2 3] 
slice3 := arr[2:] // [3 4 5]
slice4 := arr[:4] // [1 2 3 4]

// 최대 용량 지정
slice5 := arr[1:3:4] // [2 3], 최대 용량은 4
profile
All is well ! 🔥

0개의 댓글