2021. 5. 27. 17:39ㆍ개발/Golang
배열은 타입이 같은 값 여러개를 가지는 자료구조입니다. 첫번재 요소 0부터시작해서 1씩 늘어납니다. 그리고 이 위치를 인덱스라고 합니다. 배열은 아주아주 많이쓰인다고 합니다. 그렇기에 엄청중요하니 별 5개를 매기고 가야할듯합니다....
1. 배열
- 배열은 같은 타입들의 데이터로 이루어진 타입
- 배열을 이루는 각 값을 요소라고하고 요소를 가르키는 위치값을 인덱스
< 배열 작성 방법 >
// var 변수명 [요소 갯수]타입
var t [5]float64 // 배열 변수
< 예제 >
package main
import "fmt"
func main() {
var t [5]float64 = [5]float64{24.0,25.9,27.8,26.9,26.2}
for i:=0; i < 5; i++ {
fmt.Println(t[i])
}
}

- t라는 길이가 5인 배열이 생성되었습니다.
- t 길이가 5이기에 for문을 5번 반복문을 만들었고, 0~4까지 출력문을 만들었습니다.
- 배열은 t[0]이 첫 번째 값이고 마지막 값은 t[4]입니다.
2. 배열 사용법
1) 배열 변수 선언 및 초기화
var num [5]int
- int 타입 요소를 5개 갖는 배열 nums를 할당합니다. 별도로 초깃값을 지정하지 않아 각 요솟값은 int 타입 기본값인 0으로 초기화 됩니다.
day := [3]string{"monday","tuesday","wednesday"}
- string 타입 요소를 3개 갖는 배열을 days에 할당합니다.
var temps [5]float64 = [5]float64{24.3,26.7}
- float64 타입 요소를 54개 갖는 배열을 temps에 할당합니다.
- temps[0]은 24.3 , temps[1]은 26.7 ,temps[2],[3],[4]는 기본값인 0.0으로 초기화가 됩니다.
var s = [5]int{1:10,3:30}
- int타입 요소를 5개 갖는 배열 s를 할당합니다.
- 인덱스 1인 값은 10이고 인덱스 3은 값이 30입니다. 나머지 값은 int 기본값인 0으로 초기화가 됩니다.
x := [...]int{10,20,30}
- ...를 사용해 배열 요소 개수를 생략할 수 있습니다.
- x의 요소를 3개를 갖고, 10,20,30으로 초기화가 됩니다.
2) 배열 선언시 개수는 항상 상수
- 배열 선언시 개수는 항상 상수로 써야합니다.
- 변숫값을 배열 개수로 사용할 수 없습니다.
< 오류 예제 >
package main
const Y int = 3 // 상수
func main() {
x := 5
a := [x]int{1,2,3,4,5} // x는 변수
b := [Y]int{1,2,3} // y는 상수
var c [10] int
}

3) 배열 요소 읽고 쓰기
- 배열 요소에 접근하여 값을 읽고 쓰려면 배열 변수에 배괄호 [ ]를 쓰고 그 사이에 접근하고자 하는 요소의 인덱스를
적습니다.
< 예제 >
package main
import "fmt"
func main() {
nums := [...]int{10,20,30,40,50}
nums[2] = 300
for i := 0; i < len(nums); i++ {
fmt.Println(nums[i])
}
}

- nums에 요소 5개인 배열을 할당했습니다. 처음엔 10,20,30,40,50 입니다.
- main구문에 nums의 인덱스 2번재 자리를 300으로 교체하고 for문을 실행하였더니 30이 300으로 교체가 되었습니다.
- len()은 함수로 배열의 길이를 알수있는 함수입니다.
4) range 순회
- for반목문에서 range 키워드를 이요하면 배열 요소를 순회할 수 있습니다.
< 예제 >
package main
import "fmt"
func main() {
var t [5]float64 = [5]float64{24.0, 25.9, 27.8, 26.9, 26.2}
for i, v := range t {
fmt.Println(i,v)
}
}

- for문의 i는 index 값을 반환하고, v는 value의 약자로 값을 반환합니다.
- for i,v의 값 중 index를 생략할 수 있습니다. 생략의 방법은 i대신 _ (빈칸지시자) 밑줄을 이용해서 인덱스를 무효화 할 수 있습니다.
// 에러발생
for v := range t {
fmt.Println(v)
}
// 정상 입력방법
for _, v := range t {
fmt.Println(v)
}
※ range 순회는 배열 뿐아니라 문자열, 슬라이스, 맵, 채널 등에서도 사용할 수 있습니다.
3. 배열은 연속된 메모리 ( 아주 중요함 )
- 배열을 선언하면 컴퓨터는 연속된 메모리 공간을 확보합니다.
- 예를들어 var a [10]int32를 하면 int32값 10개를 찾고 int32는 4바이트므로 총 40바이트를 할당합니다.

< 컴퓨터가 인덱스에 찾아가는 방법 >

< 배열의 핵심 2가지 >
1. 배열은 연속된 메모리이다.
2. 컴퓨터는 인덱스와 타입 크기를 사용해서 메모리 주소를 찾는다.
※ Random Access를 쓰는 경우 배열을 쓰는게 좋음
( Random Access란 ? 특정위치를 가는것을 말함 )
1) 배열의 복사
package main
import "fmt"
func main() {
a := [5]int{1,2,3,4,5}
b := [5]int{500,400,300,200,100}
for i,v := range a { // 배열 a 요소 출력
fmt.Printf("a[%d] = %d\n",i,v)
}
fmt.Println() // 개행
for i,v := range b { // 배열 b 요소 출력
fmt.Printf("b[%d] = %d\n",i,v)
}
b = a // a배열을 b변수에 복사
fmt.Println() // 개행
for i,v := range b { // 배열 b 요소 출력
fmt.Printf("b[%d] = %d\n",i,v)
}
}

- 처음 a배열의 요소를 출력합니다. 두번재로는 b의 배열의 요소를 출력합니다.
- b = a로 a의 배열을 b의 배열로 복사를 하고 출력하면 a의 배열 값이 복사되서 변경된 값이 출력됩니다.
var a [5]int
var b [5]int
b=a
- a는 [5]int32이고 요소당 8바이트이며 5개가 있으므로 40 바이트입니다. b도 똑같습니다.
- b에 a를 복사하면 타입 크기인 40바이트를 메모리 공간에 복사합니다. Go언어에서는 배열 간 대입은 전체 배열의 복사로 동작합니다.
- Go 언어에서는 모든 연산자의 각항의 타입은 같아야합니다. 대입 연산자도 마찬가지입니다. 그래서 b=a코드는 a와b타입이 같지 않으면 에러가 발생합니다.
4. 다중 배열
- 중첩된 배열을 말하며, 이중배열, 삼중배열, 여러번 중첩해서 사용할 수 있습니다.
- 다중배열을 간단하게 생각하면 배열을 요소로 가지고 있다고 생각하면 이해하기가 쉽습니다.

- var b [2][5]int는 [5]int가 두개인 배열입니다. 그래서 b[0]은 첫 번째 [5]int 배열이되고, b[1]은 두번째 [5]int 배열이 됩니다.
- b[1][2]를 찾아보면 값은 8이 됩니다.
- 배열은 몇개가 중첩됐든 [ 개수 ] 타입 형태로 이해하면 됩니다.
< 다중 배열 작성법 >
var b [2][5]int{
{ 1,2,3,4,5 }, // b[0]
{ 6,7,8,9,10 }, // b[1]
} // 마지막 var b에 대한 배열의 중가로가 밑으로 내려갈시 b[1]는,써줘야됨
< 예제 >
package main
import "fmt"
func main() {
a := [2][5]int{
{1,2,3,4,5},
{6,7,8,9,10},
}
for _,arr := range a {
for _,v := range arr {
fmt.Print(v, " ")
}
fmt.Println()
}
}

- [2][5]int로 이중 배열 a를 선언하고 초기화합니다. a[0]은 첫 번째 [5]int 배열이고, a[1]은 두번째 [5]int 배열이 됩니다.
- 초기화시 닫는 중괄호 } 가 마지막 요소와 같은줄에 있지않으면 마지막 항목 뒤에 쉼표 ,를 찍어줘야 합니다.
- 첫번째 for문은 a배열을 순회하는데 첫번재 배열인 a[0]을 순회합니다. 그래서 v의 변수에 1,2,3,4,5가 차례대로 대입됩니다.
- 두번째 for문은 a배열을 순회하는데 두번째 배열인 a[1]을 순회합니다. 그래서 v의 변수에 6,7,8,9,10이 차례대로 대입됩니다.
1) 배열의 크기
- 배열이 선언되면 컴퓨터는 배열의 모든 요소를 연속되게 저장할 수 있는 메모리 공간을 할당합니다.
- [5]int에는 메모리공간이 5 x 8로 40바이트 공간이 필요합니다.
- 배열의 크기는 타입크기 요소 개수가 됩니다.
- Go언어는 최강 타입언어입니다. 타입이 아주 중요합니다!

'개발 > Golang' 카테고리의 다른 글
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 14강 포인터 (0) | 2021.05.30 |
|---|---|
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 13강 구조체 (0) | 2021.05.28 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 11강 for문 (0) | 2021.05.27 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 10강 switch문 (0) | 2021.05.26 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 9강 if문 (0) | 2021.05.24 |