swift의 배열에 대해서 이야기 해보려고 한다.
배열은 동일한 타입의 데이터를 연속해서 저장하고 사용하는 컬렉션 타입을 말한다.
swift의 배열은 java나 C에서 처럼 정해놓고 사용할 수 있긴 하지만 기본적으로 가변적인 크기를 지원한다 무슨 말이냐면 swift에서 배열은 다른언어들의 ArrayList처럼 동작한다는 말이다.
선언할때 크기 지정 없이 생성이 가능하고 값을 추가하면 자동으로 크기를 키운 배열을 생성해서 거기에 복사해 넣는다
다음은 애플 공식문서에서 발췌한 내용이다.
"모든 배열은 내용을 보관하기 위해 특정 양의 메모리를 예약합니다"
"배열에 요소를 추가하고 해당 배열이 예약된 용량을 초과하기 시작하면 배열은 더 큰 메모리 영역을 할당하고 요소를 새 저장소로 복사합니다. 새 저장소는 이전 저장소 크기의 배수입니다"
배열 생성시에 배열의 크기를 지정한 경우 추가하고자 한다면 자동으로 배열의 2배크기로 확장한 배열을 생성해서 거기에 기존의 값을 넣어준다고 한다.
이러한 원리 때문에 swift에서는 배열에 대해서 .capacity를 제공한다
배열이 메모리에서 얼마만큼의 크기를 갖는지 직관적으로 확인하게 도와준다
(배열을 .remove()하고 .count, .capacity하면 서로의 값이 다른것을 볼 수 있음)
var arr = [1,2,3,4,5] //타입추론 이용
var arr1: [Int] = [1,2,3,4,5]
var arr2 = Array<Any>()
var arr3: [Any] = Array<Any>()
arr3가 제일 교과서적인 사용방법이고 형태는 편한대로 사용하면 된다.
Any는 모든 타입을 허용하는 키워드이다, int, double, string뿐만 아니라 클로저등등 모든 인스턴스가 가능하다.
var arr = [Any]()
var arr: [Any] = []
swift에서 배열의 크기는 가변적이기에 빈배열을 생성하고 별도의 과정없이 추가만 해주면 알아서 배열이 확장된다.
arr[0], arr[1], arr[2] ... 처럼 인덱스를 이용하여 접근한다
var arr = [1,2,3,4,5]
for i in arr{
print(i)
}
1
2
3
4
5
배열이 빈 배열인지 확인해 주는 메소드로 빈배열이라면 true를 아니라면 false를 반환한다.
var arr = [Any]()
print(arr.isEmpty)
true
var arr:[Int] = [1,2,3,4,5]
var copyArr = arr
class Ref{
var index = 10
}
var refs:[Ref] = [Ref(), Ref(), Ref()]
var copyRefs = refs
copyRefs[0].index = 12
print(copyRef[0].index)
12
-> 레퍼런스를 저장하는 것이기에 메모리 주소값을 복사했기에 서로 변경이 가능한 것이다.
이처럼 배열은 정수나 문자열같은 타입 뿐만 아니라 인스턴스도 배열로 만들 수 있다.
배열검사
요소 접근
요소추가
배열의 결합?
요소 제거
요소 찾기
배열 정렬