슬라이스의 내부 구조

** 슬라이스는 실제 배열을 가리키는 포인터 정보만을 가지고 있다. 즉, 소스 슬라이스가 갖는 배열의 데이터를 타겟 슬라이스가 갖는 배열로 복제하는 과정으로 이해하면 된다.

Go slice는 내장함수 copy()를 이용하여 하나의 슬라이스를 다른 슬라이스로 복사하는 기능을 지원한다.

//실행 결과
[0 1 2]
3 6
package main
 
import "fmt"
func main() {
    source := []int{0, 1, 2}
    target := make([]int, len(source), cap(source)*2)
    copy(target, source)
    fmt.Println(target)  // [0 1 2 ] 출력
    println(len(target), cap(target)) // 3, 6 출력
}

슬라이스를 다른 슬라이스로 복사

즉 sliceB 는 4,5,6으로 치환되었다고 이해하면 된다.

→ 위 코드와 같이 ellipsis(...)를 통해 슬라이스의 컬렉션을 표현하고, sliceA에 sliceB의 컬렉션(요소집합)을 병합하겠다는 것을 의미한다.

package main
 
import "fmt"
 
func main() {
    sliceA := []int{1, 2, 3}
    sliceB := []int{4, 5, 6}
 
    sliceA = append(sliceA, sliceB...)
    //sliceA = append(sliceA, 4, 5, 6)
 
    fmt.Println(sliceA) // [1 2 3 4 5 6] 출력
}

한 슬라이스를 다른 슬라이스 뒤에 병합하는 경우

  1. 용량을 초과하는 경우

  2. 슬라이스 용량이 남아있는 경우

이때 내장함수 append()가 슬라이스에 데이터를 추가할때 내부적으로 아래의 일들이 일어나게 된다.

슬라이스에 새로운 요소를 추가할 경우 append()를 사용하며, append()의 첫 파라미터는 슬라이스 객체이고, 두번째는 추가할 요소의 값이다.

→ 위와 같이 배열과 달리 슬라이스는 자유롭게 새로운 요소를 추가할 수 있다.