동적배열 종류
c++ STL에 vector / java에는 array list/ c#에는 list / golang에는 slice
동적배열은? <--------------------------> 정적배열(fixed size array 길이 정해진 배열 [10]int)
[]int
길이 변하는 배열
실제 고정 길이의 배열이 따로 있고 그 고정 길이 배열을 가르키고, 포인트하고 있다!!
배열의 길이가 늘어나면 새로운 더 긴 배열을 만든 다음에 거기로 모든 값을 복사시키고 그 배열로 포인트 바꿈

"동적 배열은 실제 배열을 포인트하고 있다."

동적배열선언 만드는 여러 방법들
var a [] int
a:=[]int{초기값}
a:=make([]int,3)
a:=make([ ]int, length, capacity)
length 길이
내가 쓰고 있는 길이
capacity 확보해놓은 공간
(동적배열, 값을 추가할 때 배열 늘리는데 2배씩 확보해놓음 그래서 길이와 cap다를 수 있음)

항목 추가 명령어 append
a:= []int {}
a= append(a,1)
a에 다시 대입
슬라이스 = append(슬라이스,항목)

a[start Index : End Index]
(start ~ end] 마지막은 포함안됨
a[10]int{1,2,3,4,5,6,7,8,9,10}
a[4:6]
a[시작인덱스 5번째 : 6번째]
즉 5번째~6번째까지 슬라이스 의미
a[4: ]
5번째부터~ 끝까지
a[ :4]
처음부터 ~4번째까지
슬라이스는 원래 배열이 있고 그 배열을 가르키는 포인터
슬라이스는 잘라내는 게 아니라 그 일부분을 가르키는 배열!
//추가된 값이 원래길이,확보된 공간 벗어나게 되면
새 메모리 만들어서 거기에 복사됨. 그럼 메모리 주소 바뀜!
코드로 보기
package main
import "fmt"
func main() {
//////////////////////////////////len cap 메모리를 새로 확보해야돼서 주소도 달라짐 새로운 메모리에 담아서
// a:= []int{1,2}
// b:= append(a,3)
// fmt.Printf("%p %p\n",a,b)
// for i := 0; i<len(a); i++{
// fmt.Printf("%d,",a[i])
// }
// fmt.Println()
// for i := 0; i<len(b); i++{
// fmt.Printf("%d,",b[i])
// }
// fmt.Println()
// fmt.Println(cap(a)," ", cap(b))
///////make로 넣기//메모리 같아서 b값 바꾸니까 a도 바뀜
// a:= make([]int, 2,4)
// a[0]=1
// a[1]=2
// b:= append(a,3)
// fmt.Printf("%p %p\n",a,b)
// fmt.Println(a)
// fmt.Println(b)
// b[0]=4
// b[1]=5
// fmt.Println(a)
// fmt.Println(b)
//////처음부터 아예 공간을 다르게 확보하게 싶다면
// a:= []int{1,2}
//
// a := make([]int, 2, 4)
// a[0] = 1
// a[1] = 2
// //슬라이스 새로 만듦
// b := make([]int, len(a))
// for i := 0; i < len(a); i++ {
// b[i] = a[i]
// }
// b = append(b, 3)
// fmt.Printf("%p %p\n",a,b)
}
3가지 경우임
1. 값넘쳐서 새 메모리에 담아짐
2. 값안넘쳐서 메모리 a랑 b같음 b변경될때 그대로인 메모리안에서 바뀌어서 a도 바뀜
3. 아예 슬라이스 새로 만들어서 공간 따로 확보함
//배열 뒤에서 하나씩 지우기
package main
import "fmt"
//뒤에 하나씩 지워나가는 함수//배열 반환,int 맨뒤에 값도 반환
func RemoveBack(a []int) ([]int, int){
//처음부터 a배열길이에서 1뺀것, 즉 맨뒤에를 하나 없앤다
return a[ :len(a)-1], a[len(a)-1]
}
func main() {
a:=[]int{1,2,3,4,5,6,7,8,9,10}
for i :=0; i<5; i++{
var lastlostone int
a, lastlostone= RemoveBack(a)
fmt.Printf("%d,",lastlostone)
}
fmt.Println()
fmt.Println(a)
}
'웹 공부' 카테고리의 다른 글
시퀄라이즈 테이블 코드 자동 생성하는 법(mysql,database,sequelize) (0) | 2022.03.10 |
---|---|
rollbackFailedOptional 문제 (0) | 2022.02.28 |
printf와 println 차이 (0) | 2021.12.07 |
%d , %p의 의미는? (C 언어 변환문자 의미 자료형) (0) | 2021.12.07 |
aws 비용청구 환불은 받았지만 찜찜..(탄력적 IP,사용하지 않는 인스턴스) (3) | 2021.12.05 |