본 게시물은 Tucker의 Go언어 프로그래밍을 참고해 작성한 게시물입니다.
http://www.yes24.com/Product/Goods/99108736
Tucker의 Go 언어 프로그래밍 - YES24
게임 회사 서버 전문가가 알려주는 Go 언어를 내 것으로 만드는 비법구글이 개발한 Go는 고성능 비동기 프로그래밍에 유용한 언어이다. 『Tucker의 Go 언어 프로그래밍』은 Go 언어로 ‘나만의 프로
www.yes24.com
배열은 같은 타입의 데이터들로 이루어진 타입이다.
배열을 이루는 각 값은 요소라고 하고, 요소를 가리키는 위치값을 인덱스라고 한다.
배열은 같은 타입의 여러 데이터를 하나의 변수로 효과적으로 사용할 수 있도록 해준다.
예를 들어 최근 5일간 기온 데이터가 있다고 하자.
날짜마다 변수 하나를 사용해도 되겠지만 배열을 사용하면 변수를 하나만 할당해도 된다.
var 변수명 [요소개수]타입
var score [5]int = [5]int{90, 98, 76, 78, 34}
var avg float64
total := 0
for i := 0; i < 5; i++ {
total += score[i]
}
avg = float64(total) / 5.0
fmt.Println("average: ", avg)
-----------------------------------------------
average: 75.2
- int형 배열을 선언하고 초기화한다.
- 배열 길이 5이므로 5회 반복하는 for문을 만들었다.
- i값에 따라 배열의 요소에 접근하고, 그 값을 total에 더해준다.
- int형인 total을 연산위해 형변환을 시켜준다.
배열 사용법
배열 변수 선언 및 초기화
var nums [5]int
int 타입 요소를 5개 갖는 배열 nums를 할당한다. 별도로 초깃값을 지정하지 않은 각 요솟값은 int형의 기본값인 0으로 초기화된다.
var s = [5]int{1:10, 3:30}
int 타입 요소를 5개 갖는 배열 s를 할당한다. 인덱스가 1인 요솟값을 10, 3인 요솟값을 30으로 초기화한다.
x := [...]int{10, 20, 30}
...을 사용해 배열 요소 개수를 생략할 수 있다. 배열 요소 개수는 초기화되는 요소 개수와 같다.
배열 선언 시 개수는 항상 상수
배열 선언 시 개수는 항상 상수로 써야한다.
배열 요소 읽고 쓰기
배열 요소에 접근해 값을 읽고 쓰려면 대괄호 []를 쓰고 그 사이에 접근하고자 하는 요소의 인덱스를 적는다.
nums := [...]int{1, 2, 3, 4, 5}
nums[3] = 6
for i := 0; i < len(nums); i++ {
fmt.Println(nums[i])
}
----------------------------------
1
2
3
6
5
range 순회
for반복문에서 range 키워드를 사용하면 배열 요소를 순회할 수 있다.
range는 배열의 각 요소를 순회하면서 인덱스와 요솟값 두 값을 반환한다.
아래의 예시에서는 각 인덱스 값과 원솟값인 이름을 출력하고 있다.
myfamily := [4]string{"alice", "james", "justin", "jenny"}
for i, name := range myfamily {
fmt.Println(i, " : ", name)
}
----------------------------------------------------------
0 : alice
1 : james
2 : justin
3 : jenny
선언하고 사용하지 않은 변수가 있으면 컴파일 에러가 난다. 따라서 range를 사용할 때 인덱스를 사용하지 않는다면 아래와 같이 밑줄 _를 사용해 첫 번째 값을 반드시 무효화해야한다.
for _, name := range myfamily {
fmt.Println(i, " : ", name)
}
배열은 연속된 메모리
배열을 선언하면 컴퓨터는 연속된 메모리 공간을 확보한다.
예를 들어 var a [10]int32 배열을 선언하면 컴퓨터는 int32값을 10개 저장할 수 있는 연속된 메모리 공간을 찾아 할당한다.
int32 타입은 4바이트이므로 40바이트를 찾아 할당한다.
요소의 위치는 배열의 시작 주소에 인덱스 x 타입 크기를 더해서 찾아 간다.
✅ 요소 위치 = 배열 시작 주소 + (인덱스 x 타입 크기)
예를 들어 앞서말한 배열 a의 시작 주소가 100이라고 하자.
a[3] = 300 명령어를 내리면 100 + 4 x 3 = 112 즉, a[3]의 주소인 112번지부터 4바이트 메모리 공간에 300이라는 숫자를 대입하는 것이다.
✅ 배열의 핵심
❗️배열은 연속된 메모리다.
❗️컴퓨터는 인덱스와 타입 크기를 사용해서 메모리 주소를 찾는다.
배열 복사
대입 연산자를 사용하면 배열을 배열에 복사할 수 있다.
Go언어에서 대입 연산자는 우변의 값을 좌변의 메모리 공간에 복사한다. 이때 복사되는 크기는 타입의 크기와 같다.
Go언어에서 모든 연산자의 각 항의 타입은 항상 같아야한다 대입 연산자 역시 마찬가지 이다.
a := [5]int{1, 2, 3, 4, 5}
b := [5]int{6, 7, 8, 9, 10}
for i, num := range a {
fmt.Printf("a[%d] = %d\n", i, num)
}
for i, num := range b {
fmt.Printf("b[%d] = %d\n", i, num)
}
b = a
for i, num := range b {
fmt.Printf("b[%d] = %d\n", i, num)
}
----------------------------------------
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
b[0] = 6
b[1] = 7
b[2] = 8
b[3] = 9
b[4] = 10
b[0] = 1
b[1] = 2
b[2] = 3
b[3] = 4
b[4] = 5
다중 배열
다중 배열은 중첩된 배열을 말한다. 이중 배열, 삼중 배열처럼 여러번 중첩해서 사용할 수 있다.
간단하게 다중배열은 배열을 요소 가지는 배열이라고 이해하면 쉽다.
예를 들어 var a [2][5]int는 [5]int가 두 개인 배열이라고 생각할 수 있다.
// 초기화 하기
var a = [2][5]int{ // a 배열용
{1, 2, 3, 4, 5 }, // a[0] 초기화용
{6, 7, 8, 9, 10}, // a[1] 초기화용
}
a := [2][5]int{ // 이중 배열 선언
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
}
for _, arr := range a { // arr값은 순서대로 a[0]의 배열 a[1]의 배열
for _, v := range arr { // v의 값은 순서대로 a[0]와 a[1]배열의 각 요소
fmt.Print(v, " ")
}
fmt.Println()
}
배열 크기
배열이 선언되면 컴퓨터는 배열의 모든 요소를 연속되게 저장할 수 있는 메모리 공간을 할당한다.
✅ 배열 크기 = 타입 크기 x 항목 개수
- [2][5]int = 2 x 5 x 8 = 80바이트
- [3][2][5]int = 3 x 2 x 5 x 8 =240바이트
'Programming language > Golang' 카테고리의 다른 글
[Go] ch14 포인터 (0) | 2022.01.15 |
---|---|
[Go] ch13 구조체 (0) | 2022.01.15 |
[Go] 11 for문 (0) | 2022.01.15 |
[Go] 10 switch (0) | 2022.01.12 |
[Go] 09 조건문 (0) | 2022.01.12 |