CLOSE

Recommanded Free YOUTUBE Lecture: <% selectedImage %>

### 예제로 살펴보는 Go : slices

Slices는 go의 중요한 데이터타입이다. 배열과 상당히 유사하지만 더욱 강력한 기능을 제공 하기 때문에, 배열 대신 슬라이스를 주로 사용하게 된다.

배열과 다르게 슬라이스는 크기의 변경이 가능하다.
```package main

import "fmt"

func main() {
s := make([]string, 3)
fmt.Println("emp:",s )

s = "a"
s = "b"
s = "c"
fmt.Println("set:",s)
fmt.Println("get:",s)

fmt.Println("len:", len(s))

s = append(s, "d")
s = append(s, "e","f")
fmt.Println("apd:",s)

c := make([]string, len(s))
copy(c, s)
fmt.Println("cpy:",c)

l := s[2:5]
fmt.Println("sl1", l)

l = s[:5]
fmt.Println("sl2", l)

l = s[2:]
fmt.Println("sl3:", l)

t := []string{"g", "h", "i"}
fmt.Println("dcl:", t)

twoD := make([][]int, 3)
for i := 0; i < 3; i++ {
innerLen := i + 1
twoD[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}

```
0 보다 큰 슬라이스를 만들기 위해서는 make를 사용해야 한다. 예제코드에서는 스트링을 저장 할 수 있는 크기가 3인 슬라이스를 만들었다. 슬라이스의 값은 zero-value로 초기화 된다.

이렇게 만든 슬라이스는 배열처럼 값을 넣고, 꺼낼 수 있다. 마찬가지로 len을 이용해서 슬라이스의 크기를 가져올 수 있다.

값을 꺼내고 넣는 기본적인 오퍼레이션 외에, 슬라이스는 배열이 지원하지 않는 여러가지 기능들을 지원한다. 그 중 하나가 append 내장 함수다. 이 함수를 이용해서, 슬라이스에 하나 이상의 원소를 추가 할 수 있다. append 함수는 슬라이스를 반환한다.

또한 copy 함수를 이용해서 새로운 슬라이스로 복사 할 수도 있다. 코드에서는 s 슬라이스와 크기가 같은 c 슬라이스를 만들어서, s 슬라이스를 복사했다.

슬라이스는 slice[low:high]문법을 이용해서 슬라이스의 일정 부분을 가리킬 수 있다. 코드에서 l := s[2:5]에서 l은 슬라이스 s,s,s를 가리킨다. 일종의 포인터라고 볼 수 있다. s[:5]는 s ~ s를 가리킨다. s[2:]은 s ~ s을 가리킨다.

34줄에서는 슬라이스를 초기화 하고 있다. "g", "h", "i"를 포함한 크기가 3인 슬라이스 t를 만들었다.

배열과 마찬가지로 슬라이스를 원소로 하는 다차원 슬라이스를 만들 수 있다. 37줄에서 44줄까지 2차원 슬라이스를 만들고 사용하는 방법을 보여주고 있다. 먼저 크기가 3인 슬라이스를 만들었다. 이 슬라이스는 슬라이스를 원소로 한다. 그리고 루프를 돌면서, 새로운 슬라이스를 만들어서 삽입을 했다. 이렇게 만들어진 슬라이스는 아래 그림과 같이 묘사 할 수 있다. ### 슬라이스의 내부

예제로 살펴봤듯이 슬라이스는 배열의 일부분을 가리키는 포인터 처럼 작동한다. 아래 그림을 보자. 슬라이스는 배열의 위치를 가리키는 ptr과 배열의 길이인 len, 전체크기인 cap 정보를 가지고 있다. 예를 들어 25줄의 l = a[2:5]는 아래와 같이 묘사 할 수 있다. 슬라이스는 데이터의 복사 없이, 데이터를 사용 할 수 있다는 장점이 있다. 여기에 배열이 제공하지 않는 기능들을 사용하고 있으니, 어지간해서는 배열대신 슬라이스를 사용하도록 하자.

다음 예제 Map