[Tucker의 Go 언어 프로그래밍] 12장 배열

Coen·2023년 10월 11일
1

tucker-go

목록 보기
9/18
post-thumbnail

이 글은 골든래빗 《Tucker의 Go 언어 프로그래밍》의 12장 써머리입니다.

12장 배열

12.1 배열

  • 배열은 같은 타입의 데이터들로 이루어진 타입이다.
  • 배열을 이루는 각 값은 요소 라고 하고 요소를 가리키는 위치값을 인덱스라고 한다.

12.2 배열 사용법

12.2.1 배열 변수 선언 및 초기화

  • int 타입 요소를 5개 갖는 배열 nums를 할당한다.
var nums [5]int
nums[0]nums[1]nums[2]nums[3]nums[4]
00000
  • string 타입 요소 3개를 갖는 배열 days를 할당하고 초기화 한다.
days := [3]string{"monday", "tuesday", ""}
days[0]days[1]days[2]
"monday""tuesday"""
  • 인덱스별로 요소값을 초기화 할 수 있다.
nums := [5]int{1:10, 3:20}
nums[0]nums[1]nums[2]nums[3]nums[4]
0100200
  • ...를 사용하여 배열의 요소개수를 생략 가능
nums := [...]int{1:10, 3:20} //len(nums) : 4
nums[0]nums[1]nums[2]nums[3]
010020

12.2.2 배열 선언 시 개수는 항상 상수

const Y int = 3

func main() {
	x := 5
    a := [x]int{1,2,3,4,5} // Error: non-constant array bound x
    b := [Y]int{1,2,3,4,5}
    c := [10]int
}

12.2.3 배열 요소 읽고 쓰기

  • 배열 요소에 접근하여 값을 읽고 쓰려면 배열 변수에 대괄호를 쓰고 그 사이에 접근하고자 하는 요소의 인덱스를 적는다
nums := [...]int{1:10, 3:20}
for i := 0; i < len(nums); i++ {
	fmt.Println(nums[i])
}

12.2.3 range 순회

  • for 반복문에서 range 키워드를 사용하면 배열 요소를 순회할 수 있다.
nums := [...]int{1:10, 3:20}
for i, v := range nums { // i: index, v: value
	fmt.Println(i, v)
}

12.3 배열은 연속된 메모리

  • 배열을 선언하면 컴퓨터는 연속된 메모리 공간을 확보한다.
  • var a [10]int32를 선언하면 int32값 10개를 저장할 수 있는 연속된 메모리 공간을 찾아 할당한다.(int32 타입은 4바이트이므로 연속된 40바이트를 할당)
  • 컴퓨터는 인덱스에 해당하는 요소를 찾아갈때, 배열의 시작주소에 인덱스와 타입크기를 곱한 값을 더해 찾아간다.

요소 위치 = 배열 시작 주소 + (인덱스 x 타입 크기)

  • O(1)의 시간복잡도

12.3.1 배열 복사

  • 대입 연산자를 사용하면 배열 대 배열 복사를 할 수 있다.
func Test_arrayCopy(t *testing.T) {
	a := [5]int{1, 2, 3, 4, 5}
	b := [5]int{500, 400, 300, 200, 100}

	for i, v := range a {
		fmt.Printf("a[%d] = %d\n", i, v)
	}

	for i, v := range b {
		fmt.Printf("a[%d] = %d\n", i, v)
	}

	b = a
	for i, v := range b {
		fmt.Printf("a[%d] = %d\n", i, v)
	}
}
  • 배열의 복사 또한 타입과 크기가 같아야 한다.

12.4 다중 배열

  • 다중 배열은 중첩된 배열을 말한다.

  • 이중배열은 이차원 배열이라 부르고, 삼중 배열은 삼차원 배열이라고 부름

  • 컴퓨터는 차원 형태로 데이터를 저장하지 않고 전체 요소 개수만큼 연속된 메모리 형태로 저장한다.

  • 다중 배열 선언은 아래와 같다.

var b [2][5]int{
	{1, 2, 3, 4, 5},
    {6, 7, 8 ,9, 10},
}

  • 초기화시 닫는 중괄호 }가 마지막 요소와 같은 줄에 있지 않은 경우 마지막 항목 뒤에 쉼표 ,를 찍어줘야 한다(IDE가 알아서 해준다)
a := [5]int{1, 2, 3, 4, 5}
b := [5]int{
	1,
    2,
    3,
    4,
    5,
}

12.4.1 배열 크기

배열이 선언되면 배열의 모든 요소를 연속되게 저장할 수 있는 메모리 공간을 할당한다.

배열 크기 = 타입 크기 x 항목 개수
[5]int32 배열은 4byte x 5 == 20byte 이다.

profile
백엔드 프로그래머

0개의 댓글