Web/Go Lang

[Go언어] 배열과 슬라이스

JuniorEinstein 2018. 4. 27. 15:11
728x90


안녕하세요! 오늘은 Go언어의 배열과 슬라이스에 대해서 알아보도록 하겠습니다!


배열

Go언어에는 다른 언어들과 마찬가지로 배열이 있습니다.


배열은 숫자, 문자, 문자열 등을 나열해 놓은 상태로, 다음과 같이 사용될 수 있습니다.


1
2
3
4
5
6
7
8
9
10
package main
 
import "fmt"
 
func main() {
    num := []int{123}
    students := []string{"길동""영희""철수"}
    bools := []bool(truetruefalse// bool 타입은 배열로 사용할 수 없습니다!
    fmt.Println(num, students)
}
cs


배열에는 여러개의 숫자, 문자, 문자열 등이 들어갈 수 있습니다.


배열은 비슷한 데이터들을 한번에 가지고 있을 때 사용되거나, 반복적으로 사용되어야 하는 값들의 집합을 만들 때 사용합니다.


위의 경우는 배열을 선언과 동시에 초기화 주었고, 배열을 선언만 할 때는 다음과 같이 사용합니다.


1
2
3
4
5
6
7
8
package main
 
import "fmt"
 
func main() {
    var num []int
    var students []string
}
cs


선언만 한 배열은 기본적으로 아무 값도 가지고 있지 않습니다.


하지만 다음과 같이 값을 추가해 줄 수는 없습니다.


1
2
3
4
5
6
7
8
9
10
11
package main
 
import "fmt"
 
func main() {
    var num []int
    var students []string
 
    num = {123// 이렇게 사용할 수 없습니다!
    students = {"길동""영희""철수"// 이렇게 사용할 수 없습니다!
}
cs


그렇기 때문에 우리는 append라는 함수를 이용해서 값을 추가해 주어야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
 
import "fmt"
 
func main() {
    var num []int
 
    // num 배열에 값을 추가합니다.
    num = append(num, 0)
    fmt.Println(num)
 
    // 한번에 많은 값들을 넣을 수도 있습니다.
    num = append(num, 123)
    fmt.Println(num)
}
cs


위의 코드는 다음과 같은 결과를 출력합니다.


1
2
3
>go run main.go
[0]
[0 1 2 3]
cs


배열의 용량

Go언어의 배열도 다른 언어들과 마찬가지로 용량을 설정할 수 있습니다.


용량을 설정하게 되면 용량 이상의 값을 넣을 수 없습니다. (개수)


하지만 용량 이하의 값을 가지고 있는 것은 가능합니다. (C언어와는 다르게 말이죠. C언어에서는 10칸의 배열을 만들면 10칸을 모두 채워야 합니다. 초기화를 해주지 않으면 쓰레기 값이 들어갑니다.)


다음과 같이 사용합니다.


1
2
3
4
5
6
7
package main
 
import "fmt"
 
func main() {
    var num [3]int
}
cs


여기에는 append 없이 인덱스로 접근해서 값을 추가할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
package main
 
import "fmt"
 
func main() {
    var num [3]int
 
    num[0= 10
    num[1= 15
}
cs


슬라이스

슬라이스는 영어 단어 그대로 "자르다"라는 의미를 가지고 있습니다. 배열 등을 잘라서 다른 값으로 분리해내는 기능입니다.


Go언어의 슬라이스는 파이썬의 슬라이싱과 비슷한 형태를 하고 있습니다.


슬라이스는 배열이나 문자열을 잘라내는 기능을 하는데, 다음과 같이 사용합니다.


1
2
3
4
5
6
7
8
9
10
11
package main
 
import "fmt"
 
func main() {
    primes := [6]int{23571113}
 
    var s []int = primes[1:4// 1번째 원소부터 4-1번째 원소까지를 반환합니다.
    fmt.Println(s) // [3 5 7]
}
 
cs


간단하죠?


다양한 슬라이싱 기법들에 대해서는 아래를 참고하세요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
 
import "fmt"
 
func main() {
    primes := [6]int{23571113}
 
    // 배열의 모든 인덱싱은 0부터 시작됩니다.
    // 0 => 2, 1 => 3, 2 => 5 ... 의 형태입니다.
    var s []int = primes[1:4// 1번째 원소부터 4-1번째 원소까지를 반환합니다.
    fmt.Println(s) // [3 5 7]
 
    s = primes[:4// 처음부터 4-1번째 원소까지를 반환합니다.
    fmt.Println(s) // [2 3 5 7]
 
    s = primes[2:] // 5번째 원소부터 끝까지의 원소를 반환합니다.
    fmt.Println(s) // [5 7 11 13]
}
 
cs


슬라이싱은 문자열에 대해서도 가능합니다.


1
2
3
4
5
6
7
8
9
package main
 
import "fmt"
 
func main() {
    var s string = "Hello World!" // 슬라이싱은 문자열에 대해서도 가능합니다.
    fmt.Println(s[5:8]) // Wo
}
 
cs


아래의 예제는 Go언어에서 배열의 크기와 용량을 확인하는 예제입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main
 
import "fmt"
 
func main() {
    s := []int{23571113}
    printSlice(s)
 
    // 크기가 0인 슬라이스
    s = s[:0]
    printSlice(s)
 
    // 슬라이스를 확장합니다.
    s = s[:4]
    printSlice(s)
 
    // 앞의 두 개의 원소를 잘라냅니다.
    s = s[2:]
    printSlice(s)
}
 
func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
 
cs


출력 결과

1
2
3
4
5
>go run main.go
len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]
cs


결론

오늘은 Go언어의 배열과 슬라이싱에 대해서 알아보았습니다!


배열과 슬라이싱은 내가 원하는 자료들을 추출하는데에 효과적으로 사용할 수 있습니다.


아직 설명드리지는 않았지만, struct나 2, 3중 배열에 대해서도 슬라이싱이 가능합니다.


그러면 다음 시간에는 구조(struct)에 대해서 알아보도록 합시다!

728x90