검색결과 리스트
글
[swift2.1] Array와 Dictionary 기초
Swift는 컬렉션 타입으로 Array, Dictionary, Set을 가지고 있습니다. 그중 Array와 Dictionary의 사용법을 간략히 알아보겠습니다.
Array
Array는 순서있는 아이템을 저장하는 컬렉션으로, Aarry에 저장되는 아이템들의 값은 중복을 허용합니다.
배열 생성
Array는 아이템의 타입(Int)을 제테릭 인자로 받아 선언할 수 있습니다.
var intArray = Array<Int>()
축약형식을 사용하면 좀더 간단하게 선언할 수 있습니다.
var ints = [Int]()
Array 리터럴을 사용에서 하나 이상의 요소를 갖는 배열을 선언해보겠습니다.
var shoppingList:[String] = ["Eggs", "Milk"]
할당되는 값에서 타입추론이 가능하기 때문에 [String] 타입을 명시하지 않아도 됩니다.
var shoppingList = ["Eggs", "Milk"]
Array의 count 속성을 사용해서 배열 아이템의 개수를 알수 있습니다.
print("쇼핑리스트에는 \(shoppingList.count)개의 아이템이 들어있습니다.")
isEmpty 속성을 사용하면 배열이 비어있는지 유무를 알수 있습니다.
if shoppingList.isEmpty {
print("쇼피리스트가 비어있습니다.")
} else {
print("쇼피리스트가 비어있지 않습니다.")
}
아이템 추가
쇼핑리스트에 아이템을 추가해보겠습니다.
shoppingList.append("Flour")
// ["Eggs", "Milk", "Flour"]
shoppingList += ["Baking Powder"]
// ["Eggs", "Milk", "Flour", "Baking Powder"]
이번에는 여러 아이템을 동시에 추가해보겠습니다.
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// ["Eggs", "Milk", "Flour", "Baking Powder", "Chocolate Spread", "Cheese", "Butter"]
아이템 삽입
이번에는 특정 인덱스에 아이템을 삽입해보겠습니다.
shoppingList.insert("Maple Syrup", atIndex: 0)
// ["Maple Syrup", "Eggs", "Milk", "Flour", "Baking Powder", "Chocolate Spread", "Cheese", "Butter"]
아이템 확인
인덱스를 사용해 배열 아이템에 접근할 수 있습니다.
var firstItem = shoppingList[0]
// firstItem은 "Maple Syrup"
first 속성은 배열의 첫번째 아이템입니다.
if let first = shoppingList.first {
// first는 "Maple Syrup"
}
아이템 변경
몇 가지 쇼핑품목을 변경해보겠습니다.
shoppingList[1] = "Six eggs"
// ["Maple Syrup", "Six eggs", "Milk", "Flour", "Baking Powder", "Chocolate Spread", "Cheese", "Butter"]
range 연산자를 사용하면 특정범위의 아이템을 한번에 교체할 수 있습니다. 다음 구문은 4~6 인덱스 범위의 3개의 아이템을 ["Banana", "Apples"] 로 교체합니다.
shoppingList[4...6] = ["Bananas", "Apples"]
// ["Maple Syrup", "Six eggs", "Milk", "Flour", "Bananas", "Apples", "Butter"]
Array의 인덱스 범위를 초과하여 접근하면 Array index out of range 런타임 에러가 발생합니다.
아이템 삭제
배열의 첫번째와 마지막 아이템을 삭제해보겠습니다.
// 첫번째 아이템 삭제
let mapleSyrup = shoppingList.removeAtIndex(0)
// 마지막 아이템 삭제
let butter = shoppingList.removeLast()
// ["Six eggs", "Milk", "Flour", "Bananas", "Apples"]
배열 순회
가장 간단한 순회방법은 for 문을 사용하는 방법입니다.
for var i=0; i < shoppingList.count; i++ {
print(shoppingList[i])
}
인덱스를 사용할 필요가 없다면, 좀더 심플한 for-in 문을 사용합니다.
for item in shoppingList {
print(item)
}
나열자를 사용하면 좀더 심풀한 문법으로 순회가 가능합니다.
for (index, value) in shoppingList.enumerate() {
print("index \(index) : \(value)")
}
반대방향으로의 순회도 가능합니다.
for (index, value) in shoppingList.enumerate().reverse() {
print("index \(index) : \(value)")
}
SequenceType 타입의 forEach 함수를 사용해서도 배열을 순회할수 있습니다. (Array는 SequenceType 프로토콜을 구현하고 있음)
// forEach 함수에 trailing 클로져로 반복해서 처리할 몸체를 전달합니다.
shoppingList.forEach {
print($0)
}
forEach 함수는 루프가 아니기 때문에 몸체안에서 continue 또는 break 문을 사용하여 도중에 중단하거나 건너뛸수 없습니다. return 문을 사용해서 루프를 건너뛸수는 있습니다.
초기값을 갖는 Array 생성
count, repeatedValue 인자를 받는 생성자를 사용하여 초기화된 배열을 생성할수 있습니다.
var threeDoubles = [Double](count: 3, repeatedValue: 0.0)
var anotherThreeDoubles = Array(count: 3, repeatedValue: 2.5)
Dictionary
Dictionary는 순서가 없는 키,값 쌍을 저장하는 자료구조입니다. Hashable 프로토콜을 구현하는 타입만이 Dictionary의 키로 사용될 수 있습니다. String, Int, Float, Double, Bool 및 연관값이 없는 enum 은 모두 디폴트로 Hashable 프로토콜을 구현하기 때문에 키로 사용될 수 있습니다.
Dictionary 생성
String 타입의 키와 값을 갖는 배열을 생성해보겠습니다.
var airports:Dictionary<String, String> = ["TYO":"Tokyo", "DUB":"Dublin"]
축약형태의 사용도 가능합니다.
var dictionary = [String:String]()
var airports = ["TYO":"Tokyo", "DUB":"Dublin"]
아이템의 개수
count 속성은 Dictionary에 저장된 아이템의 개수입니다.
print("airports 사전에는 \(airports.count) 개의 아이템을 포함하고 있습니다.")
키-값 설정
키-값 쌍을 추가해보겠습니다.
airports["LHR"] = "London"
airports["APL"] = "Apple International"
키-값 조회
Dictionary는 특정 키-값 쌍이 없을 수 있기 때문에 Optional 타입으로 반환됩니다.
airports["LHR"] = "London"
print(airports["LHR"])
// Optional("London")
Dictionary에서 키값 조회는 안전하게 옵셔널 바인딩을 사용합니다.
if let airportName = airports["DUB"] {
print("공합 이름은 \(airportName) 입니다.")
} else {
print("해당 공항은 사전에 포함되어 있지 않습니다.")
}
키-값 변경
updateValue 함수를 사용하면 값을 변경하면서 이전 값을 반환해줍니다.
if let oldValue = airports.updateValue("Doublin International", forKey: "DUB") {
print("DUB의 이전 값은 \(oldValue) 입니다.")
}
키-값 삭제
해당키의 값을 nil로 설정하여 삭제할 수 있습니다.
airports["APL"] = nil
print(airports["APL"])
// nil
삭제되는 값을 참조해야 한다면 removeValueForKey 함수를 사용합니다.
if let removedValue = airports.removeValueForKey("DUB") {
print("삭제되는 값은 \(removedValue) 입니다.")
} else {
print("공항사전은 DUB 값을 포함하지 않습니다.")
}
Dictionary 순회
for-in 문을 사용해서 키,값을 순회할 수 있습니다.
for (airportCode, airportName) in airports {
print("\(airportCode): \(airportName)")
}
keys 속성을 통해 Dictionary의 모든 키 배열을 얻어올 수 있습니다.
for airportCode in airports.keys {
print("공항 코드: \(airportCode)")
}
values 속성으로 모든 값의 배열을 얻어올 수 있습니다.
for airportName in airports.values {
print("공항 이름: \(airportName)")
}
Dictionary의 복사동작
Dictionary가 다른 변수/상수에 할당 되거나, 함수의 인자로 전달될 때 어떤 일이 발생할까요?
Value 타입은 값이 복사되고, Reference 타입은 참조가 복사된다
위와 같이 Swift의 기본규칙을 이해하면 Dictionary의 복사동작을 쉽게 이해할 수 있습니다. Dictionary의 키와 값들은 value 타입이면 복사되고, 클래스와 같은 참조타입이면 참조변수가 복사됩니다.
var ages = [ "Peter":23, "Wei":35, "Anish":65, "Katya":19 ]
ages Dictionary 를 다른 변수에 할당해보겠습니다.
var copiedAges = ages
할당문을 만나는 순간 ages를 이루는 키,값들은 모두 복사됩니다.(String, Int는 value 타입.)
copiedAges["Peter"] = 24
print(copiedAges["Peter"]) // 24
print(ages["Peter"]) // 23
copiedAges Dictionary의 "Peter" 키의 값을 변경해도 ages의 동일 키의 값이 변경되지 않는 것을 통해 Dictionary가 복사되었음을 알 수 있습니다.
Array의 복사동작
Array의 동작도 Dictionary와 유사합니다. 할당 또는 함수의 인자로 전달되면 아이템이 value 타입인 경우 복사됩니다.
var a = [1, 2, 3]
var b = a
var c = a
배열 a를 변수 b와 c에 할당합니다.
print(a[0]) // 1
print(b[0]) // 1
print(c[0]) // 1
배열 a의 첫번째 아이템을 변경해보겠습니다.
a[0] = 42
b, c의 첫번째 아이템들은 어떻게 되었을까요?
print(a[0]) // 42
print(b[0]) // 1
print(c[0]) // 1
b,c 모두 첫번째 아이템이 변경되지 않았습니다. 즉 할당과 동시에 복사가 이루어졌다는 것을 알수 있습니다. Swift 레퍼런스 문서에서는 성능 최적화의 일환으로 "Array의 크기를 변경하는 연산이 발생한 경우에만 복사가 이루어진다" 고 하는데, 문서가 업데이트 되지 않은 건지, 최적화 옵션에 따라 동작이 다른건지는 의문입니다.
다음 시간에는 Set에 대해 정리해보겠습니다.
'Swift' 카테고리의 다른 글
| [swift2.2] Xcode 7.3 Swift 언어 변경사항 (0) | 2016.03.24 |
|---|---|
| [swift2.1] Swiftris - swift로 만드는 테트리스 (1) | 2015.12.29 |
| [swift2.1] Array와 Dictionary 기초 (0) | 2015.12.22 |
| [swift2.1] Swift 프로토콜 지향 프로그래밍 2 (0) | 2015.12.09 |
| [swift2] 키워드로 보는 Swift (0) | 2015.11.30 |
| [swift2] Currying 함수 (0) | 2015.11.25 |