오늘은 배열에 대해 배워보도록 하겠다.
배열 선언 방법부터 값 대입, 배열 복사까지 천천히 알아보도록 하자.
먼저, 기본적으로 배열을 선언하는 방법에 대해 알아보도록 하겠다.
아래 예제를 보도록 하자.
var arr1 [5]int
arr1[2] = 7
fmt.Println(arr1) // 0,0,7,0,0
위 예제를 통해 알 수 있는 것은 golang은 선언과 동시에 0으로 초기화한다는 것이다.
그 후, arr1[2] = 7을 통해 3번째 요소 값을 7로 바꾸는 작업을 진행했다.
배열의 인덱스는 0부터 시작한다.
ex) arr1 [5]int == 배열의 크기: 5 == index 범위: 0~4
- arr1[0] = 0
- arr1[1] = 0
- arr1[2] = 0
- arr1[3] = 0
- arr1[4] = 0
마지막으로 출력문 호출을 통해 배열의 현재 값을 출력해봄으로써 각 요소별로 값이 어떻게 들어갔는지 확인할 수 있다.
이번에는 값을 직접 대입하여 배열을 선언하는 방법을 알아보도록 하겠다.
이번에는 그 방법과 더불어 배열을 선언하는 여러가지 스타일에 대해 배워보도록 하겠다.
아래 예제를 보도록 하자.
var arr2 [5]int = [5]int{1,2,3,4,5}
var arr3 = [5]int{5,4,3,2,1}
arr4 := [5]int{5,5,5,5,5}
fmt.Println(arr2) // 1,2,3,4,5
fmt.Println(arr3) // 5,4,3,2,1
fmt.Println(arr4) // 5,5,5,5,5
위 예제와 같이 배열을 선언하고 값을 대입하는 방법은 3가지가 있다.
아래로 내려갈수록 점점 생략되는 부분이 많은 것을 확인할 수 있는데 가독성과 편리성을 고려하여 본인이 편안한 방식으로 선택하면 될 것 같다.
이번에는 미리 배열의 크기를 정하지 않고 값의 갯수에 따라 동적으로 배열의 크기를 선언하는 방법에 대해 배워보도록 하겠다.
사실, 동적으로 정의한다하여 크게 다르진 않는 듯 하다.
아래 예제를 통해 확인해보도록 하겠다.
var arr5 = [...]int{1,2,3}
arr6 := [...]int{3,2,1}
fmt.Println(arr5) // 1,2,3
fmt.Println(arr6) // 3,2,1
동적 선언과 정적 선언의 차이는 [] 속에 있다.
- 정적 배열 선언 예제
arr1 := [5]int{1,2,3,4,5}- 동적 배열 선언 예제
arr1 := [...]int{1,2,3,4,5}
정적으로 사용할 때는 괄호 내부를 원하는 크기의 숫자로 채워주지만
동적으로 사용할 때는 괄호 내부를 [...]으로 채워주면 된다.
위와 같이 처리하게 되면 후미에 붙어오는 값의 크기만큼 자동으로 동적할당 해주게 된다.
마지막으로 배열을 복사하는 방법에 대해 알아보도록 하겠다.
다른 언어에선 배열을 저장할 때, 첫 index에 대한 주소값을 저장하는 경우가 있지만 golang은 배열 자체를 저장한다고 봐야한다.
아래 예제를 통해 알아보도록 하자.
localArr := [3]int{1,2,3}
copyArr := localArr
fmt.Println(localArr) // 1,2,3
fmt.Println(copyArr) // 1,2,3
localArr[2] = 0
fmt.Println(localArr) // 1,2,0
fmt.Println(copyArr) // 1,2,3
위 예제는 golang의 배열 복사는 깊은 복사로 진행된다는 것을 알려준다.
- 깊은 복사:
데이터 자체를 통째로 복사한다.
복사된 두 객체는 완전히 독립적인 메모리를 차지한다.- 얕은 복사:
아주 최소한만 복사를 한다. (값 자체를 복사하는 것이 아니라 주소값을 복사하여 같은 메모리를 가리킨다.
인스턴스가 메모리에 새로 생성되지 않는다.
다음의 정의를 살펴본 후, 위 예제에 대해 생각해본다면 깊은 복사인 이유를 알 수 있다.
1. localArr의 배열을 copyArr라는 변수에 복사
2. localArr의 요소값 수정
3. localArr만 값이 수정되고 copyArr는 처음 복사된 값을 유지한다.
이는 서로 독립적인 공간에 따로 저장되어 있고 서로 종속되지 않았다는 것을 증명하는 것이다.
오늘은 배열을 다루는 방법에 대해 알아봤다.
다른 언어와 유사한 점이 많은 만큼 크게 어려운 점은 없었던 것 같다. 오늘 제일 중요하게 암기해야 할 것은 golang의 배열은 깊은 복사의 개념으로 복사가 진행된다는 것인 것 같다!
꼭 암기하기!