Scroll Top

GOLANG – 배열 및 슬라이스

GO

배열

배열은 데이터를 순차적으로 저장하는 구조이다.

go에서 배열의 첫번째는 0부터 할당하며 그 다음은 1, 2 순서로 인덱스를 부여한다.

package main
import "fmt"
func main() {
        var a [3]int // int 형 3개 요소를 갖는 배열 선언
        a[0] = 1 // 값 입력
        a[1] = 2
        a[2] = 3
        fmt.Println(a)
        fmt.Println(a[1])
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run array.go
[1 2 3]
2

변수를 정의하자마자 값을 지정하는 것 처럼 배열도 초기값을 지정할 수 있다.

package main
import "fmt"
func main() {
        var a1 = [3]int{1, 2, 3} // int 형 3개 요소를 갖는 배열 선언
        var a2 = [...]int{1, 2, 3} // int 형 배열 선언하나 크기는 자동으로

        fmt.Println(a1)
        fmt.Println(a2)
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run array.go
[1 2 3]
[1 2 3]

다차원 배열

golang 은 다차원 배열을 지원한다. 배열 크기부분을 복수개로 선언하면 된다.

package main
import "fmt"
func main() {
        var aa [4][3]int
        aa[2][2] = 10

        fmt.Println(aa)
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run array.go
[[0 0 0] [0 0 0] [0 0 10] [0 0 0]]

다차원 배열의 초기값 지정은 단차원 배열의 초기값 지정과 비슷하다.

package main
import "fmt"

func main() {
    var a = [3][3]int{
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
    }
    fmt.Println(a[1][2])
    fmt.Println(a)
}
└─$ go run array.go
6
[[1 2 3] [4 5 6] [7 8 9]]

슬라이스

배열의 크기를 자동으로 지정할 순 있어도 지정된 크기를 동적으로 확장하는 기능은 없다. 이를 포함한 몇가지 제약을 해소하기 위해 Go에서는 슬라이스(Slice) 기능이 있다.

슬라이스는 크기를 미리 지정하지 않을 수 있고 그 크기가 나중에 동적으로 변경할 수 있고 부분 배열을 발췌할 수 있다.

package main
import "fmt"

func main() {
        var a []int // 슬라이스 변수 선언
        a = []int{1, 2, 3} //변수에 값 저장

        fmt.Println(a)

        a[1] = 10
        fmt.Println(a)
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run slice.go
[1 2 3]
[1 10 3]

Go에서 슬라이스 변수를 선언하는 다른 방법은 make() 함수를 이용할 수 있다.
이 함수를 이용하면 길이(Length)와 용량(Capacity)를 지정할 수 있다.

package main
import "fmt"

func main() {
        a := make([]int, 1, 3)

        fmt.Println(a)
        fmt.Println(len(a), cap(a))
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run slice.go
[0]
1 3

슬라이스에 별도의 길이와 용량을 지정하지 않으면 기본적으로 0으로 설정되는데 이를 NIL Slice 라고 한다.

package main
import "fmt"

func main() {
        var a []int

        if a == nil {
                fmt.Println("NIL Slice")
        }

        fmt.Println(a)
        fmt.Println(len(a), cap(a))
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run slice.go
NIL Slice
[]
0 0

부분 슬라이스

슬라이스에서 일부를 발췌해 부분 슬라이스를 만들 수 있다.
부분 슬라이스는 ” 슬라이스[처음인덱스:마지막인덱스] ” 형식이다.

package main
import "fmt"

func main() {
        a := []int{0, 1, 2, 3, 4, 5}
        fmt.Println(a)
        fmt.Println(len(a), cap(a))
        a = a[2:6] // 처음 인덱스와 마지막 인덱스 지정
        fmt.Println(a)
        fmt.Println(len(a), cap(a))
        a = a[1:] // 적지 않음으로 생략 가능 [:] 일 경우 전체를 의미
        fmt.Println(a)
        fmt.Println(len(a), cap(a))
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run slice.go
[0 1 2 3 4 5]
6 6
[2 3 4 5]
4 4
[3 4 5]
3 3

슬라이스 병합과 복사

슬라이스는 자유롭게 새로운 요소를 추가할 수 있다. 슬라이스에 추가하기 위해선 내장된 함수인 append()를 사용한다.

package main
import "fmt"

func main() {
        a := []int{0, 1}
        fmt.Println(a)
        a = append(a, 2)
        fmt.Println(a)
        a = append(a, 3, 4, 5)
        fmt.Println(a)
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run slice.go
[0 1]
[0 1 2]
[0 1 2 3 4 5]

append() 함수를 통해 슬라이스

슬라이스에서 내장된 함수인 copy()를 이용해 한 슬라이스를 다른 슬라이스로 복사할 수 있다.

package main
import "fmt"

func main() {
        a := []int{0, 1, 2}
        fmt.Println(a)

        b := []int{3, 4, 5}
        fmt.Println(b)

        a = append(a, b...) // ... 기호는 해당 슬라이스의 모든 요소를 의미함
        fmt.Println(a)

        copy(a, b) // (target, source) 형식임. 따라서 기존 0, 1, 2 를 순서대로 대체함
        fmt.Println(a)
}
┌──(daleji㉿DESKTOP)-[~]
└─$ go run slice.go
[0 1 2]
[3 4 5]
[0 1 2 3 4 5]
[3 4 5 3 4 5]

Related Posts

Leave a comment

You must be logged in to post a comment.