Programming language/Golang

[Go] 12 배열

chaenii 2022. 1. 15. 03:06

본 게시물은 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