『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 12강 배열

2021. 5. 27. 17:39개발/Golang

728x90
반응형

배열은 타입이 같은 값 여러개를 가지는 자료구조입니다. 첫번재 요소 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
}

x가 변수여서 에러가 생김

 

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바이트를 할당합니다.

 

 

 

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

배열 시작 주소가 100번지일 경우, index 3이고 int32인 경우

 

< 배열의 핵심 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언어는 최강 타입언어입니다. 타입이 아주 중요합니다!

 

GO는 최강 타입언어....

 

728x90
반응형