본문 바로가기
IT 초보코딩의 세계/Go 언어

Go언어의 자료구조 배열과 슬라이스 1장

by 조이럭키7 2023. 3. 29.
반응형

◆ 배열

● 동일한 자료형 겂들의 집합

크기가 고정

선언과 초기화

package main

import (
  "fmt"
)
func main() {
  var ar1 [3]int

  ar1 = [3]int{1, 2, 3}
   fmt.Println(ar1)

  var ar2 = [3]int{10, 20, 3}
  fmt.Println(ar2)
}

데이터 개수는 len 함수를 이용해서 구할 수 있음

각 데이터 접근은 [인덱스]로 가능한데 인덱스는 0 부터 데이터 개수 -1까지

package main

import (
  "fmt"
)

func main() {
  ar := [3]int{10, 20, 30}
  n := len(ar)
  fmt.Println(n)
  for i:=0; i<n; i++{
  fmt.Println(ar[i])
  }
}

▶ 데이터 일부분 선택하고자 한다면

배열이름[시작 위치:종료 다음 위치]

시작 위치를 생략하면 0

종료 다음 위치를 생략하면 len

package main

import (
  "fmt"
)

func main() {
  ar := [5]int{10, 20, 30, 40, 50}
  fmt.Println(ar[2:4])
  fmt.Println(ar[:4])
  fmt.Println(ar[2:])
}

▶ 배열의 순회

range 배열이름{ }을 이용하면 인덱스 와 인덱스 번째에 해당하는 데이터를 순서대로 리턴

인덱스나 값이 필요없을 때는 _로 변수를 선언

package main

import (
  "fmt"
)

func main() {
  ar := [3]string{"대한민국", "중국", "일"}
  for idx, value := range ar {
  fmt.Printf("%d:%s\n", idx, value)
  }
}

▶ 배열의 복사 : 배열 변수를 다른 변수에 할당

package main

import (
  "fmt"
)

func main() {
  ar := [3]string{"대한민국", "중국", "일본"}
  br := ar
  fmt.Println(ar[0])
  fmt.Println(br[0])
  ar[0] = "아시안컵"
  fmt.Println(ar[0])
  fmt.Println(br[0])
}

◆ 슬라이스

슬라이스는 길이가 고정되어 있지 않은 배열로 동적으로 크기가 늘어남

배열과는 달리 레퍼런스 타입

● 생

var 슬라이스명 []자료형
var a [ ]int // int 형 슬라이스

슬라이스는 배열과 달리 [ ] (대괄호) 안에 길이를 지정하지 않는데 이 경우 슬라이스의 길이는 0

슬라이스는 make 함수를 사용하여 공간을 할당해야 값을 넣을 수 있음

슬라이스 선언과 동시에 make 함수를 사용하면 대괄호와 자료형은 생략할 수 있음

:= 사용하여 var 생략할 수 있음

var a [ ]int = make([]int, 5) // make 함수로 int 형에 길이가 5인 슬라이스에 공간 할당
var b = make([]int, 5) // 슬라이스를 선언할 때 자료형과 [] 생략
c := make([]int, 5) // 슬라이스를 선언할 때 var 키워드, 자료형과 [] 생략

초기화로는 

a := []int{32, 29, 78, 16, 81} // 슬라이스를 생성하면서 값을 초기화
b := []int{ 32,
29,
78,
16,
81, //여러줄로나열할때는마지막요소에콤마를붙임
}

 슬라이스는 배열을 내장하고 있는데 배열이 더 늘어났을 때 사용할 공간을 미리 할당할 수 있음

make([]자료형, 길이, 용량)

길이는 len 함수를 이용해서 확인하고 용량은 cap 함수로 확인

슬라이스의 내부 구조

슬라이스가 가리키는 부분 배열의 첫번째 요소에 대한 포인터

슬라이스가 가리키는 부분 배열의 크기

원본 배열의 용량(capacity - 원본 배열에 남아있는 요소의 개수)은 슬라이스의 크기보다 크거나 같음

var mySlice = []int{l,2,3,4,5}

부분 슬라이스

var subSlice = mySlice[2:4]

데이터 복사 - Copy

package main

import (
  "fmt"
)

func main() {
  var myAr = [5]int{1,2,3,4,5}
  var subAr = myAr[2:4]
  myAr[2] = 30
  fmt.Println(myAr[2])
  fmt.Println(subAr[0])

  var mySlice = []int{1,2,3,4,5}
  var subSlice = mySlice[2:4] 
  mySlice[2] = 30
  fmt.Println(mySlice[2])
  fmt.Println(subSlice[0])

  // 길이가 큰 슬라이스
  var myBigSlice = []int{1,2,3,4,5,6}

  // 작은 슬라이스를 생성
  var mySubSlice = make([]int,2)

  // myBigSlice에서 mySubSlice로 2개 요소의 값을 복사
  copy(mySubSlice,myBigSlice[2:4])

  myBigSlice[2] = 30
  fmt.Println(myBigSlice[2])
  fmt.Println(mySubSlice[0])
}

append 함수

슬라이스에 요소를 추가하는 함수

슬라이스 용량이 한계에 도달하면 append 함수는 모든 데이터를 저장할 수 있는 크기의 내부 배열과 슬라이스를 생성

append 함수는 임의의 개수의 인수로 호출할 수 있는 가변 인수 함수(variadic function)

package main

import (
  "fmt"
)

func main() {
  ar := []int{1, 2, 3}
  br := []int{5, 6, 7}
  ar = append(ar, 4)
  ar = append(ar, br...)

  fmt.Println(ar)
}

 

반응형

댓글