무지개곰
article thumbnail
반응형

목차

정적 배열

동적 배열

배열 순회


배열

같은 자료형의 변수들을 한 번에 관리할 수 있는 배열에 대하여 선언부터 값을 불러오는 방법까지 알아보겠습니다.

배열 선언

지금까지 C#, Java, JavaScript, Solidity 등 몇 가지 언어를 공부했었지만 Go언어의 배열 선언 방식은 처음 보았습니다.

처음 보는 방식이기도 하면서 다양한 선언 방법이 있습니다. 예시 코드를 보며 설명드리겠습니다. 출력 예시는 설명 끝에 작성하겠습니다.

var testArr1 [5]int
var testArr2 [4]int = [4]int{1,2,3}
var testArr3 = [6]int{2:10,4:20}
testArr4 := [...]string{"안녕","반가워","잘가", 5:"또 봐"}
testArr5 := []float64{12.3, 45.6, 8:78.9}

1. testArr1

testArr1이 int자료형을 가지는 배열의 길이가 5인 배열이라고 지정합니다. 값을 지정하지 않았기에 자료형의 기본값이 채워진 배열로 testArr1이 선언됩니다.

2. testArr2

testArr2가 int자료형을 가지는 배열의 길이가 4인 배열이라고 지정합니다. R value를 통하여 배열의 값을 지정합니다. 작성된 값은 0번 index부터 차례로 입력됩니다.

3. testArr3

testArr3이 어떤 타입인지 작성하지 않았지만 R value가 길이가 6인 int자료형의 배열이라고 선언되었습니다. 따라서 변수선언때와 마찬가지로 컴파일 시 타입이 알맞은 타입으로 지정됩니다.

또한 중괄호 안에 '2:10'과 '4:20'은 index 2에 10의 값, index 4에 40의 값을 선언하겠다는 의미입니다.

4. testArr4

testArr4는 [...]이라는 표현을 사용하여 배열을 선언하였습니다. 배열의 길이를 입력하지 않고 선언 시 배열의 길이를 확인하여 지정합니다.

5. testArr5

testArr5는 동적 배열로 배열의 길이가 따로 지정되어있지 않고 배열에 요소를 추가하기도 하고 제거할 수 있습니다.

 

출력

testArr1 -> [0 0 0 0 0]
testArr2 -> [1 2 3 0]
testArr3 -> [0 0 10 0 20 0]
testArr4 -> [안녕 반가워 잘가   또 봐]
testArr5 -> [10 20 30 0 0 50]
testArr5[3] -> 0
testArr6 -> [12.3 45.6 0 0 0 0 0 0 78.9]

동적 배열

배열의 길이가 정해지지 않은 배열로 slice라고도 부릅니다.

배열과 slice는 메모리 할당 방식이 다르기 때문에 같은 타입이 아닙니다. (type확인은 reflect package를 import 하여야 합니다.)

compareArr1 := [3]int{1,2,3}
compareArr2 := []int{5,6,7}
fmt.Println(reflect.TypeOf(compareArr1))
fmt.Println(reflect.TypeOf(compareArr2))

//출력
//[3]int
//[]int

동적 배열 선언 (make 사용)

선언 방법은 배열선언과 같은 방법도 있고 make를 사용하는 방법도 있습니다.

make([]int,3)
make([]int,3,5)

첫 번째 매개변수는 slice의 타입을 지정합니다.

두 번째 매개변수는 slice의 초기 길이를 지정합니다.

세 번째 매개변수는 slice의 초기 용량을 지정합니다.

길이는 현재 동정 배열 slice의 길이를 의미하고 용량은 slice의 길이가 늘어날 수 있기에 변경에 대비하여 미리 확보해 둔 용량이라고 생각하시면 됩니다.

길이는 len이라는 내장함수, 용량은 cap이라는 내장함수를 사용하여 확인할 수 있습니다.

fmt.Printf("길이는 %v, 용량은 %v", len(slice), cap(slice))

동적 배열 메서드

동적 배열의 값을 추가하고 제거하는 방법 등 동적 배열에 사용되는 메서드를 소개하겠습니다.

 

1. append

go에서 append는 조금 신기하다고 느꼈습니다.

testArr := []int{1, 3, 5, 7, 9}

testArr = append(testArr, 11, 13)

slice에 요소를 추가하려면 위와 같이 사용하여야 합니다. append의 경우 첫 번째 매개변수로 slice를 입력받아 요소를 추가할 slice를 지정하고 두 번째 매개변수부터 추가할 요소를 입력합니다.

append를 사용하면 slice에 추가되는 것이 아닌 요소가 추가된 배열을 반환하기에 반환한 값을 원하는 slice에 대입하여야 합니다.

 

2. 요소 제거

append처럼 요소를 제거하는 메서드는 없습니다. slice를 잘라서 append를 활용하여 값을 제거할 수 있습니다.

testArr := []int{1, 3, 5, 7, 9, 11, 13}

testArr := append(testArr[:3], testArr[4:]...)

콜론(:)을 사용하여 배열을 자를 수 있습니다. 인덱스 번호 앞에 콜론을 쓰게 되면 인덱스 번호 앞의 값까지 배열을 자릅니다. 인덱스 번호 뒤에 콜론을 쓰게 되면 인덱스 번호를 포함하여 끝까지 자르게 됩니다.

위의 예시는 인덱스 3번의 값인 7이 제거됩니다.

배열에 가변인자(...)를 붙이게 되면 배열의 요소를 풀어 나열합니다.


배열 순회

반복문을 통하여 배열을 순회하는 방법을 알아보겠습니다.

for i :=0; i<len(checkArr1); i++{
	fmt.Println(checkArr1[i])
}

이와 같은 방법으로 배열을 순회합니다. 이 방법은 많은 언어에서 사용하는 방법이라 익숙하였습니다.

Go를 하며 새롭게 배운 방법은 range를 활용하는 방법입니다. 다른 언어에도 있는지는 모르겠으나 저는 이번에 처음 알게 되었습니다.

for i,v := range checkArr1{
	fmt.Println(i,v)
}

이와 같은 방법을 사용하여 보다 짧고 간결하게 배열을 순회할 수 있습니다. i는 index값 v는 index에 해당하는 요소 값이 출력됩니다. i와 v는 변수이므로 다른 값을 넣어도 무관합니다.

Go언어는 선언된 변수를 사용하지 않으면 오류가 발생합니다. 따라서 index값이 필요 없는 경우는 '_'를 이용하여 생략할 수 있습니다.

for _, value := range checkArr1{
	fmt.Println(value)
}

 

 

 

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!