티스토리 뷰

Swift

Swift3 ) Array. count? capacity?

Zedd0202 2017. 8. 17. 21:13
반응형

안녕하세요 :) Zedd입니다. 


글을 뭐 쓸까 하다가...Swift의 배열의 정말 유용한 메소드. 바로 count!


var arr = [1,2,3,4,5]

print(arr.count) //5


한번에 배열안의 원소개수를 리턴해줍니다. 우리 언제 이 count메소드를 썼는지 기억나시나요?

ㅎㅎ

테이블뷰에서 섹션안의 row의 개수를 리턴해줄때 return arr.count를 해줬었죠?

정말 유용한 메소드에요.


그런데


var arr = [1,2,3,4,5]

print(arr.count) //5

print(arr.capacity) //5


배열 공부하다가 보니까, capacity라는 메소드가 있더라구요. 지금은 똑같이 5를 리턴하는데, 어쩔때는 count와 다른값을 리턴하더라구요.


오늘은 이 capacity에 대해서 알아봅시다.



 Array. count? capacity?




정의 : 새 저장소를 할당하지 않고 배열에 포함 할 수있는 총 요소 수.


모든 배열은 배열안의 데이터를 저장할 수 있는 특정양의 메모리를 예약한다고 해요.

배열에 요소를 추가할 때, 해당 배열이 예약된 용량을 초과하기 시작하면 배열은 더 큰 메모리 영역을 할당하고, 요소를 방금 할당한 새 메모리에 복사합니다.

이때 새로운 저장소는 이전 저장소 크기의 2배입니다. (저번에 썼던 array doubling과 똑같네요 :))

<Array Doubling읽으러가기>


하지만, 배열에 추가할 요소의 수를 알고 있는 경우에는 굳이 이렇게 새 메모리영역을 할당하는 작업을 하지 않아도 되겠죠?

이때, reserveCapacity라는 메소드를 사용해 배열의 용량을 미리 설정하여 재할당 및 복사연산을 수행할 필요없도록 할 수 있습니다.


하지만, 우리는 일반적으로 용량에 대해 걱정할 필요가 없어요.

재할당은 거의 성능문제가 되지 않습니다 :)

Swift는 효율적인 재할당기법을 사용하기때문이죠. 


capacity가 대충 뭔지는 알겠네요..

그럼 위에서 말했듯이, 어떻게 배열의 용량을 정하는지 알아봅시다. 


var arr2 = [Int]()

arr2.count //0

arr2.capacity //0

arr2.reserveCapacity(16)

arr2.count //0

arr2.capacity //16

reserveCapacity메소드를 사용해서 capacity가 바뀐 것. 보이시나요?


자, 아까 capacity는 Array Doubling전략을 사용한다고 그랬죠? 

그럼 진짜인지 한번 확인해봅시다. 



Array를 처음만들었으니, 아직까지는 capacity가 0이겠죠? 

여기에 값을 append해볼게요. 


capacity가 2로 변한거 보이시나요?!

새로운 저장소가 이전 저장소 크기의 2배라고 언급한 거. 기억하시죠? 

이전 저장소 크기의 2배라고 했지만, 0에서는 2로 증가하나봐요. 

그럼 지금 capacity는 "2"가 되었고, 지금 1이라는 값이 하나 들어가 있으니 한개는 더 넣을 수 있겠네요? 



여전히 capacity가 2인것을 볼 수 있죠? 

그럼 지금 배열의 용량이 꽉찼죠? 

지금 값을 하나 더 넣으면 capacity가 어떻게 변할까요?

"배열에 요소를 추가할 때, 해당 배열이 예약된 용량을 초과하기 시작하면 배열은 더 큰 메모리 영역을 할당하고, 요소를 방금 할당한 새 메모리에 복사합니다. 이때 새로운 저장소는 이전 저장소 크기의 2배입니다."


ㅎㅎ한번 볼까요? 

네!! 4로 변한 것을 볼 수 있습니다 :)

이렇게 계속 배열의 용량만큼 넣으면 계속 2배로 증가하게 된답니다 ㅎㅎ


하지만, 위에서 말했던 reserveCapacity메소드를 쓰게되면, 미리 메모리 공간을 예약하는 것이므로, 그 용량이 차기 전까지 array Doubling을 하지 않는답니다.

만약, 처음에 reserveCapacity메소드를 이용해서 용량을 4로 잡아줬다면, 4개가 차기 전까지는 arrayDoubling이 일어나지 않는답니다. 하지만 4개 이상이면 8로 증가하게되겠죠 ㅎㅎ? 


var arr2 = [Int]()

arr2.reserveCapacity(4)

arr2.capacity//4

arr2.append(contentsOf: [1,2,3,4,5])

arr2.capacity//8


신기하죠? capacity 도대체 얘는 뭐지..했었는데, 이제 뭔지 좀 알 것 같아요!

(근데 딱히 쓸 일을 없.........ㅁ미안 capacity야)


아무튼!! 오늘도 도움이 되었으면 좋겠어요ㅎㅎ!


반응형