콜렉션 타입(Collection Type)
Swift에서 제공하는 콜렉션 타입으로 Array, Set, Dictionary가 있다.
- Array : 순서를 가지는 값의 집합
- Set : 순서가 없으며 각 값은 유리한 값
- Dictionary : key-value 쌍으로 존재하는 순서가 없다.

- swift에서 key나 value로 쓰이는 값에 대해서 타입 체크에 엄격한다. 문제 발생 소지를 줄인다.
- 주의 : Swift의 콜렉션은 제네닉 콜렉션이다.
콜렉션 값 변경 (mutability of collections)
- array, set, dictionary를 변수에 대입하면 여 변경가능한 속성을 가지고 있다. 생성 후에 추가, 삭제, 아이템 변경등이 가능하다. 하지만 상수에 대입하면 변경가능한 속성을 잃게 되고 크기나 내용을 변경할 수 없다.
- 주의 : 콜렉션이 변경되지 않는 경우에는 immutable 콜렉션을 생성하는게 좋다. 이렇게 해야 swift는 콜렉션의 성능을 최적화한다.
Array
- Array가 가지는 2가지 속성
- 동일한 값들을 가진다
- 순서를 가진다.
- 따라서 동일한 값이 다른 위치에 존재할 수 있다.
정의
- 주의 : Swift의 Array 타입은 NSArray 클래스로 연결된다.
배열 타입 선언 방법
- Array에서 들어가는 값의 타입이 Element일 경우
Array<Element>와 같이 표현한다. 단축표현으로[Element]와 같이 쓸 수 있다. 2가지가 같은 일을 하지만 2번째 표현을 선호한다.
빈 배열 만들기
- 초기화 문법을 이용해서 빈 배열을 만든다.
var someInts = [Int]()
print("someInts is of tyep [Int] with \(someInts.count) items.")
- someInts 배열에 들어가는 값의 타입은 Int가 된다.
- 함수 인자나 타입을 지닌 변수 혹은 상수와 같이 만약 이미 타입 정보를 제공하고 있다면 빈 배열 구문만 가지고도 빈 배열을 생성할 수 있다. 문법으로는
[]와 같이 사용한다.someInts.append(3) someInts[]기본 값으로 배열 생성
- 초기화에서 특정 사이즈와 값을 지정할 수 있다. 새 배열에 추가할 아이템의 수와 대입할 값을 아래와 같이 초기화시에 사용할 수 있다.
var threeDoubles = [Double](count:3, repeatedValue: 0.0)
- threeDoubles는 Double 타입이며 [0.0, 0.0, 0.0]이 된다.
2개 배열을 추가해서 하나의 배열로 만들기
- 2개 배열을 1개 배열로 만드는데
+연산자를 사용한다. 새로운 생성될 배열은 이 2개 배열이 가지는 타입과 같다.
var anotherThreeDoubles = [Double](count:3, repeatedValue: 2.5)
var sixDoubles = threeDoubles + anotherThreeDoubles
- 자 sixDoubles의 값은 어떻게 될까? 직접 확인해보기 바란다.
배열 구문으로 배열만들기
- 배열 구문으로 초기화가 가능하다.
- 이 방법은 1개 이상의 아이템을 배열을 만드는 간단한 방법이기도 하다.
[]내부에 원하는 순서로 값을 순서대로 나열하며 값 사이에,를 사용해서 구분한다.[value1, value2, value3]쇼핑리스트를 표현하는 배열을 만들어 보자.
var shoppingList: [String] = ["Eggs", "Milk"]shoppingList는 문자열 값을 가지는 배열로 선언하였다. 이 배열에는 문자열 값만 추가할 수 있게 되었다. Eggs와 Milk 이렇게 2개 문자열을 가지고 초기화하였다.
주의 : shoppingList 배열은 변수로 선언하였다. 그 이유는 향후에 아이템이 추가될 수 있다는 것을 의미한다.
- 배열 구문이 String 타입이라 shoppingList에 별도의 타입을 지정하지 않아도 된다. 짧게 아래와 같이 표현할 수 있다.
var shoppingList = ["Eggs", "Milk"]
배열 접근 및 수정
- 배열에 접근 및 수정하기 위해 사용하는 방법은 메소드, 프로퍼티를 이용하거나 subscript 문법을 사용할 수 있다.
- 배열에서 아이템 갯수를 얻기 위해서
count프로퍼티를 이용한다.
print("The shopping list contains \(shoppingList.count) items.")
count가 0인지 아닌지를 검사하는isEmpty프로퍼티가 있다.
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
배열의 마지막에 아이템을 추가하기 위해서
append메소드를 이용한다.shoppingList.append("Flour") shoppingList += ["Baking Power"] shoppingList += ["Chocolate Spread", "Cheese", "Butter"]+=연산자를 이용하는 방법도 가능하다.- subscript 문법을 이용해서 배열에 있는 값을 추출할 수 있다. 배열에서 몇 번째 인덱스를 가지는지를 알면 아래와 같이 사용할 수 있다.
var firstItem = shoppingList[0] - 주의 : 배열에 있는 첫번째 아이템의 인덱스는 0이다. 0부터 인덱스를 시작하므로 0기반 인덱스(zero-index)라고 한다.
- subscript 문법을 이용해서 특정 인덱스의 값을 변경하는 방법은 인덱스를 지정하고 할당하는 방법을 사용한다.
shoppingList[0] = "Six eggs" - 한번에 특정 범위의 값들을 변경하는 것이 가능하다. 변경할 배열 아이템의 수는 달라도 상관없다.
shoppingList[4...6] = ["Bananas", "Apples"] 4번째, 5번째, 6번째 값 대신 "Bananas"와 "Apples"가 들어간다.
주의 : subscript 문법을 이용해서 배열의 마지막에 값을 추가하는 방식은 사용하지 않는다.
- 아이템을 특정 배열에 삽입하는 경우 insert 메소드를 이용한다.
shoppingList.insert("Maple Syrup", atIndex: 0) - 위 예제에서 배열의 첫번째에 Maple Syrup을 삽입한다. 따라서 인덱스 0은 이제 Maple Syrup을 가리키게 된다.
- Quiz : removeAtIndex 메소드는 어떤 일을 할까?
답 : 배열에서 특정 인덱스의 값을 삭제하고 제거된 값을 반환한다.
let mapleSyrup = shoppingList.removeAtIndex(0)주의 : 배열의 범위를 벗어나는 인덱스로 배열에 접근하는 경우 런타임 에러가 발생한다. 따라서 인덱스를 이용하는 경우
count프로퍼티로 인덱스 가능한 범위를 미리 검사해야한다. 마지막 인덱스 값은count - 1이므로 이 범위를 넘는 인덱스는 사용하지 않는다.- Quiz : removeLast 메소드가 하는 일은? removeAtIndex 메소드를 이용해서 동일한 일을 하도록 만들어 보자.
- 답 : 마지막 아이템을 삭제한다. removeAtIndex(count - 1)과 같은 동작을 한다.
let apples = shoppingList.removeLast()
배열에서 이터레이터
- 배열내에 포함된 모든 아이템을 루프를 이용해서 출력하는 예제
for item in shoppingList { print(item) } - 각 아이템에 대해서 인덱스와 값 모둑 필요한 경우에는 enumerate() 메소드를 이용한다. enumerate()가 반환하는 것은 인덱스와 값으로 구성된 튜플(tuble)이다. 따라서 이 반환 튜플을 인덱스와 값 부분으로 분리해야 한다.
for (index, value) in shoppingList.enumerate() {
print("Item \(index + 1): \(value)")
}
Set
- Set의 성질
- 동일 타입 값의 집합
- Set내부에 각 값은 유일무이하다.(중복되지 않는다.)
- 인덱스를 가지지 않는다.
- 주의 : NSSet 클래스와 연결된다.
Set 타입에 대한 해쉬값(Hash Value)
사용용도
문법
예제
Quiz
- 정의에 대한 질문
- 용도에 대한 질문
- 예제 관련