Chapter 11. 슬라이스(1)

조성권·2021년 8월 17일
0
post-thumbnail

오늘은 슬라이스를 배워보도록 하겠다.
golang의 슬라이스배열과 유사하지만 다른 타입이다.
어떠한 차이점이 있는지 함께 확인해보도록 하자.

1. 슬라이스 선언

1-1. 기본 슬라이스 선언

  • 슬라이스란 ?
  1. 길이가 고정되어 있지 않으며 동적으로 크기가 늘어난다.
  2. 배열과는 달리 레퍼런스 타입니다.

슬라이스의 정의는 위와 같으며 실제로 선언하는 방법에 대해 아래 예시를 통해 알아보도록 하자.

  • var 슬라이스명 []자료형
    ex) var a []int

슬라이스는 위와 같이 타입을 정의한다.
위 예시는 int형 슬라이스로 정수형 값에 한하여 동적으로 그 길이를 늘려나갈 수 있다.

1-2. make함수

위에서 보여준 것처럼(1-1) 길이를 정하지 않은 상태로 선언할 수도 있지만 make함수를 통해 길이를 미리 한정시킬 수도 있다.

1-2-1. param 2개인 경우

  • make([]자료형, 길이)

아래 예제를 통해 실제 선언하는 방법에 대해 확인해보도록 하자.

var a []int = make([]int, 5)	// 길이가 5인 int형 슬라이스
var b = make([]int, 5)	// 선언 시, 자료형, [] 생략
c := make([]int, 5)	// 선언 시, var 키워드 및 자료형, [] 생략

위 3가지 방법은 모두 오류없이 동작하는 올바른 문법이다.
make함수의 첫번째 param에 자료형, 두번째 param에 슬라이스의 길이를 넣어주게 되면 해당 길이만큼 0으로 초기화된 슬라이스를 만들 수 있다.

1-2-2. param 3개인 경우

  • make([]자료형, 길이, 용량)

아래 예제를 통해 실제 선언하는 방법에 대해 확인해보도록 하자.

var s1 []int = make([]int, 5, 10)	// 길이는 5이며 용량은 10인 슬라이스
var s2 = make([]int, 5, 10)	// 길이는 5이며 용량은 10인 슬라이스
s3 := make([]int, 5, 10)	// 길이는 5이며 용량은 10인 슬라이스

fmt.Println(s1)	// [0,0,0,0,0]
fmt.Println(s2)	// [0,0,0,0,0]
fmt.Println(s3)	// [0,0,0,0,0]

위 예제는 길이뿐만 아니라 용량까지 세팅할 수 있는 것을 확인할 수 있다.
세개의 변수 모두 길이는 5이며 용량은 10인 슬라이스를 만든 것이다.

길이: 인덱스로 접근할 수 있는 공간 (슬라이스 내부 배열의 최대 길이)
용량: 실제 메모리에 할당된 공간. (만약, 슬라이스에 요소를 추가해 용량이 가득차면 자동으로 더 늘어남)

용량을 미리 세팅하는 것은 생소할 수 있다. 하지만 용량을 적게 잡아두었다하여 더 늘어나지 못하는 것이 아니기 때문에 처음부터 용량을 어떻게 잡아야할지 심각하게 고민할 필요는 없다고 생각된다.

IF) 미리 슬라이스의 용량을 크게 할당할 경우,
THEN)
장점: 요소가 추가될 때마다 메모리를 새로 할당하지 않아도 되므로 성능상 이익
단점: 처음부터 메모리 공간을 많이 차지하게 된다.


IF) 슬라이스 용량을 작게 할당할 경우,
THEN)
장점: 처음 메모리 공간은 적게 차지한다.
단점: 요소가 추가될 때마다 메모리를 새로 할당하게 되므로 성능 저하

서로간에 장단점이 존재하므로 만약 효율성을 위해 용량까지 세팅하려 한다면 미리 고민해보는 것이 좋을 것 같다.

1-2-3. 길이, 용량 확인

마지막으로 슬라이스의 길이, 용량을 확인하는 함수를 알아보도록 하겠다.
아래 예제를 보도록 하자.

slc := make([]int, 5, 10)

fmt.Println(len(slc))	// 5: 길이
fmt.Println(cap(slc))	// 10: 용량

위 예제는 int형 슬라이스에 길이는 5, 용량은 10으로 초기화했다.

길이: len(슬라이스명)
용량: cap(슬라이스명)

다음 함수를 통해 본인이 만든 슬라이스의 길이, 용량를 확인할 수 있으며 이를 활용하여 추가적인 로직을 설계할 수 있다.

2. 값 추가하기

2-1. 일반적인 값 추가

최초 슬라이스를 생성하게 되면 0으로 해당 길이만큼 초기화된다.
그렇다면 이번엔, 0이 아닌 본인이 원하는 값으로 슬라이스 내부를 채워넣는 방법에 대해 알아보도록 하자.

  • append(슬라이스명, 값1, 값2, 값3, ...)
a := []int{1,2,3}
a = append(a,4,5,6)

fmt.Println(a)	// [1,2,3,4,5,6]

위 예제에서 a는 최초에 [1,2,3]이었다.
그 후, append함수를 통해 a에 [4,5,6]을 추가한 슬라이스를 다시 a에 대입함으로써 a 내부를 [1,2,3,4,5,6]으로 늘리는 작업을 진행한 것이다.

이런식으로 append함수는 첫번째 param은 값을 추가할 슬라이스, 두번째 param부터는 추가할 값을 쭉 나열하면 된다.

2-2. 다른 배열의 값 붙이기

이번에는 A라는 슬라이스, B라는 슬라이스가 있고 A 슬라이스에 B슬라이스의 값을 붙이는 방법에 대해 알아보도록 하겠다.

아래 예제를 보도록 하자.

A := []int{1,2,3}
B := []int{4,5,6}

A = append(A,B...)	// B... : B의 모든 배열 값을 붙인다

fmt.Println(A)	// [1,2,3,4,5,6]

위 예제에서 가장 중요한 부분은 append(A,B...)이다.
B...은 B의 가변인자 값에 대해 모두 A에 붙이겠다는 것으로 B에 몇개의 인자가 있든 이를 그대로 A의 후미에 붙여주는 작업을 진행한다.

슬라이스에 값을 추가할 때는 외부 인자값을 낱개로 붙일 수도 있지만(2-1) 어떠한 슬라이스 내부 값을 그대로 붙여야하는 경우(2-2)도 있을 수 있으니 미리 숙지해놓는게 좋을 것 같다.

마무리

오늘은 슬라이스에 대해 알아보았다.
오늘 알아본 슬라이스는 배열과 유사하지만 다른 점이 있는 것을 확인할 수 있었다. 동적으로 값을 재할당할 수 있다는 점에서 배열보다 장점이 많아보이지만 아직 슬라이스에 대해 모두 배우진 못했기 때문에 조금 더 배워보고 다시 생각해봐야겠다.

profile
천천히, 완벽히 배워나가고자 하는 웹 서비스 엔지니어

0개의 댓글