Go 언어

본문 바로가기
사이트 내 전체검색


Go 언어
Go 언어

2. 슬라이스 사용하기

페이지 정보

작성자 관리자 댓글 0건 조회 2,335회 작성일 19-03-11 21:08

본문

2. 슬라이스 사용하기

슬라이스는 배열과 같지만, 길이가 고정되어 있지 않으며 동적으로 크기가 늘어난다.

배열과 달리 레퍼런스 타입이다.


var 슬라이스명 []자료형



슬라이스는 배열과 달리 [](대괄호)안에 길이를 지정하지 않는다. 이렇게 생성된 슬라이스의 길이는 0이다.

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

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

일반변수와 마찬가지로 :=를사용하여 var를 생략할 수 있다.


make([]자료형, 길이)


package main

import "fmt"

func main() {

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

 fmt.Println(a)
 fmt.Println(b)
 fmt.Println(c)

}


슬라이스를 생성하고 공간을 할당하면 슬라이스의 요소는 모두 0으로 초기화된다.


package main

import "fmt"

func main() {

 a := []int{32, 29, 78, 16, 81} // 슬라이스를 생성하면서 값을 초기화

 b := []int{

  32,
  29,
  78,
  16,
  81,  // 여러 줄로 나열할 때는 마지막 요소에 콤마를 붙임

 }

 fmt.Println(a)
 fmt.Println(b)

}


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


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


package main

import "fmt"

func main() {

 a := make([]int, 5, 10) // 길이가 5이고 용량이 10인 슬라이스 생성

 fmt.Println(len(a)) // 길이는 5
 fmt.Println(cap(a)) // 용량은 10

}



package main

import "fmt"

func main() {

 a := make([]int, 5, 10) // 길이가 5이면 a[0], a[1], a[2], a[3], a[4]가 생성

 fmt.Println(a[4]) // 0: make 함수를 사용하면 슬라이스의 요소는 모두 0으로 초기화
 fmt.Println(a[5]) // 길이를 벗어난 인덱스에 접근했으므로 런타임 에러 발생
 fmt.Println(a[8]) // 길이를 벗어난 인덱스에 접근했으므로 런타임 에러 발생

}



1. 슬라이스에 값 추가하기


append(슬라이스, 값1, 값2, 값3)


append 함수를 사용하면 슬라이스의 맨뒤에 값을 추가할 수 있다.


package main

import "fmt"

func main() {

 a := []int{1, 2, 3}

 a = append(a, 4, 5, 6)

 fmt.Println(a) // [1 2 3 4 5 6]

}


슬라이스에 다른 슬라이스를 붙이려면 append 함수를 사용할 때 ...을 사용한다.


package main

import "fmt"

func main() {

 a := []int{1, 2, 3}
 b := []int{4, 5, 6}

 a = append(a, b...) // 슬라이스 a에 슬라이스 b를 붙일 때는 b...을 씀

 fmt.Println(a) // [1 2 3 4 5 6]

}

append함수는 가변인자 함수이므로 ...을 사용하여 슬라이스에 들어 있는 요소를 각각 넘겨준다.

...은 가변인자 함수를 만들때도 사용할 수 있고 가변인자 함수에 값을 넘겨줄때도 사용할 수 있다.

2. 레퍼런스 타입

​슬라이스는 레퍼런스 타입이다.

내장된 배열에 대한 포인터이므로 슬라이스끼리 대입하면 값이 복사되지 않고 참조만 한다.

​package main

import "fmt"

func main() {

 a := [3]int{1, 2, 3}
 var b [3]int

 b = a          // 배열의 요소가 모두 복사됨
 b[0] = 9       //  b[0]에 9를 대입하면 b의 첫 번째 요소만 바뀜

 fmt.Println(a) // [1 2 3]
 fmt.Println(b) // [9 2 3]

}

슬라이스를 만들고, 대입해 본다.​


package main

import "fmt"

func main() {

 a := []int{1, 2, 3}
 var b []int    // 슬라이스로 선언

 b = a          // a를 b에 대입해도 요소가 모두 복사되지 않고 참조만 함
 b[0] = 9       // 슬라이스는 참조이므로 a[0], b[0]의 값이 모두 바뀜

 fmt.Println(a) // [9 2 3]
 fmt.Println(b) // [9 2 3]

}​

3. 슬라이스 복사하기

​슬라이스의 요소를 모두 복사할 때는 copy 함수를 사용한다.

copy(복사될 슬라이스, 원본 슬라이스)

​package main

import "fmt"

func main() {

 a := []int{1, 2, 3, 4, 5}
 b := make([]int, 3) // make 함수로 공간을 할당

 copy(b, a)     // 슬라이스 a의 요소를 슬라이스 b에 복사

 fmt.Println(a) // [1 2 3 4 5]
 fmt.Println(b) // [1 2 3]: 슬라이스 b의 길이는 3이므로 a의 요소 3개만 복사됨

}

package main

import "fmt"

func main() {

 a := []int{1, 2, 3}
 b := make([]int, 3)

 copy(b, a)     // 슬라이스를 복사하였으므로
 b[0] = 9       // b[0]만 바뀌고, a[0]은 바뀌지 않음

 fmt.Println(a) // [1 2 3]
 fmt.Println(b) // [9 2 3]

}
 

​4. 슬라이스와 용량

​슬라이스는 길이를 동작으로 늘릴 수 있다.

​package main

import "fmt"

func main() {

 a := []int{1, 2, 3, 4, 5}

 fmt.Println(len(a), cap(a)) // 5 5: 길이가 5이며 용량이 5인 슬라이스

 a = append(a, 6, 7)         // 슬라이스 a에 값 6, 7을 추가

 fmt.Println(len(a), cap(a)) // 7 10: 길이가 7이며 용량이 10인 슬라이스, 용량이 늘어남!

}

​5. 부분 슬라이스 만들기

슬라이스는 기존 슬라이스에서 일정 위치를 지정하여 부분 슬라이스를 만들 수 있다.


​슬라이스[시작인덱스:끝인덱스]


package main

import "fmt"

func main() {

 a := []int{1, 2, 3, 4, 5}

 b := a[0:5]    // a의 인덱스 0부터 5까지 참조

 fmt.Println(a) // [1 2 3 4 5]
 fmt.Println(b) // [1 2 3 4 5]

}

시작인덱스와 끝 인덱스를 설정하여 ​일부만 참조한다.


package main

import "fmt"

func main() {

 a := []int{1, 2, 3, 4, 5}

 fmt.Println(a[0:3]) // [1 2 3]
 fmt.Println(a[1:3]) // [2 3]
 fmt.Println(a[2:5]) // [3 4 5]

} 

 package main

import "fmt"

func main() {

 a := []int{1, 2, 3, 4, 5}

 fmt.Println(a[:])        // [1 2 3 4 5]
 fmt.Println(a[0:])       // [1 2 3 4 5]
 fmt.Println(a[:5])       // [1 2 3 4 5]
 fmt.Println(a[0:len(a)]) // [1 2 3 4 5]

 fmt.Println(a[3:])       // [4 5]
 fmt.Println(a[:3])       // [1 2 3]
 fmt.Println(a[1:3])      // [2 3]

} 


슬라이스[시작인덱스:끝인덱스:용량]


부분 슬라이스를 만들면서 용량도 지정할 수 있다.


package main

import "fmt"

func main() {

 a := []int{1, 2, 3, 4, 5, 6, 7, 8}

 b := a[0:6:8] // 인덱스 0부터 6까지 가져와서 부분 슬라이스로 만들고 용량을 8로 설정

 fmt.Println(len(b), cap(b)) // 6 8: 길이가 6이며 용량이 8인 슬라이스
 fmt.Println(b)              // [1 2 3 4 5 6]

}



댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.