콜렉션 타입(Collection Type)

Swift에서 제공하는 콜렉션 타입으로 Array, Set, Dictionary가 있다.

  • Array : 순서를 가지는 값의 집합
  • Set : 순서가 없으며 각 값은 유리한 값
  • Dictionary : key-value 쌍으로 존재하는 순서가 없다. Collection
  • 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

  • 정의에 대한 질문
  • 용도에 대한 질문
  • 예제 관련