◆ 배열
● 동일한 자료형 겂들의 집합
● 크기가 고정
● 선언과 초기화
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)
}
'IT 초보코딩의 세계 > Go 언어' 카테고리의 다른 글
Go언어의 구조체(포인터, Struct) 1장 (6) | 2023.03.30 |
---|---|
Go언어의 자료구조 맵(Map)와 컨테이너 (0) | 2023.03.30 |
Go 언어의 기본 문법 함수 와 클로저 5장 (4) | 2023.03.28 |
Go 언어의 기본 문법 for 구문 3장 (4) | 2023.03.24 |
Go 언어의 기본 문법 연산자와 포인터, if 구문, switch 구문 2장 (0) | 2023.03.24 |
댓글