스위프트에서는 콜렉션 타입으로 배열(Array), 셋(Sets), 사전(Dictionary) 세 가지를 지원한다.
콜렉션의 변경
var varArr = [Int]()
varArr.append(10) // OK.
let letArr = [Int]()
letArr.append(10) // ERR.
✔️ 위의 예제와 같이 콜렉션을 변수(var)에 할당하면 이 콜렉션은 변경가능하고 상수(let)에 할당하면 변경 불가능 하다.
배열 (Array)
배열 (Array) : 순서가 있는 리스트 컬렉션이다.
var emptyArr = [Int]() // 변수에 할당
print("emptyArr is of type [Int] with \(emptyArr.count) items.")
// emptyArr is of type [Int] with 0 items.
let emptyArr2 = [Int]() // 상수에 할당
✔️ 위의 예제와 같이 빈 배열을 생성할 수 있다.
var intArr = [Int]()
intArr.append(4) // item : [4]
intArr = [] // item : []
✔️ 위의 예제와 같이 배열의 아이템 타입을 그대로 유지한 채 배열을 비울 수 있다.
var doubleArr = Array(repeating: 1.1, count : 5)
// doubleArr : double 타입의 [1.1, 1.1, 1.1, 1.1, 1.1]
doubleArr.append(1.7)
// doubleArr : double 타입의 [1.1, 1.1, 1.1, 1.1, 1.1, 1.7]
doubleArr.append("YEO")
// ERR. Double 타입의 배열에 String 타입의 아이템을 삽입하려고 했기 때문;
var doubleArr2 = [Double](repeating: 1.4, count : 3)
// doubleArr2 : double 타입의 [1.4, 1.4, 1.4]
var doubleArr3 = [Double](repeating: "YEO", count : 5)
// ERR. Double 타입의 배열에 String 타입의 아이템을 초기설정값으로 설정했기 때문;
✔️ 위의 예제와 같이 repeating 메소드와 count 메소드를 이용해 기본 값으로 빈 배열을 생성할 수 있다.
✅ Array(repeating: 초기값, count: 배열길이)
✅ [데이터 타입](repeating: 초기값, count: 배열길이)
var arr1 = [Int](repeating: 1, count : 3)
// arr1 = [1, 1, 1]
var arr2 = Array(repeating: 2, count : 4)
// arr2 = [2, 2, 2, 2]
var arr3 = arr1 + arr2
// arr3 = [1, 1, 1, 2, 2, 2, 2]
var anotherArr = [String](repeating: "A", count : 4)
// anotherArr = ["A", "A", "A", "A"]
var arr4 = arr1 + anotherArr
// ERR. Int형 배열과 String형 배열을 합치려 했기 때문;
✔️ 위의 예제와 같이 + 연산자를 이용해 배열을 합칠 수 있다.
var names: [String] = ["Yeo", "Kim"]
var eplTeam = ["Liverpool", "Arsenal", "Chelsea"]
✔️ 위의 예제와 같이 리터럴을 이용해 배열을 생성할 수 있다.
var eplTeam = ["Liverpool", "Arsenal", "Chelsea"]
print("eplTeam contains \(eplTeam.count) items.")
// eplTeam contains 3 items.
✔️ 위의 예제와 같이 count 메소드를 이용해 배열의 원소 개수를 확인할 수 있다.
var avengers = ["CaptainAmerica", "IronMan", "Thor", "Hulk", "BlackWidow", "Hawkeye"]
if avengers.isEmpty {
print("empty")
} else {
print("not empty")
}
// not empty
✔️ 위의 예제와 같이 isEmpty 메소드를 이용해 배열이 비었는지 확인할 수 있다.
var stringArr = [String]() // String타입의 배열; 변수에 할당
stringArr.append("Yeo") // OK.
stringArr.append(5) // ERR. String타입의 배열에 Int형 아이템을 추가하려고 하기 때문.
✔️ 위의 예제와 같이 append 메소드를 이용해 배열의 타입에 맞는 아이템을 추가할 수 있다.
var avengers = ["CaptainAmerica", "IronMan", "Thor", "Hulk", "BlackWidow", "Hawkeye"]
var newMember = ["DoctorStrange"]
avengers += newMember
// avengers = ["CaptainAmerica", "IronMan", "Thor", "Hulk", "BlackWidow", "Hawkeye", "DoctorStrange"]
✔️ 위의 예제와 같이 += 메소드를 이용해 배열을 합칠 수 있다.
var avengers = ["CaptainAmerica", "IronMan", "Thor", "Hulk", "BlackWidow", "Hawkeye"]
var firstItem = avengers[0]
// firstItem : "CaptainAmerica"
avengers[3...5] = ["empty"]
// ["CaptainAmerica", "IronMan", "Thor", "empty"]
✔️ 위의 예제와 같이 배열의 특정 위치의 원소에 접근할 수 있다.
var eplTeam = ["Liverpool", "Arsenal", "Chelsea"]
eplTeam.insert("Tottenham", at:0)
// ["Tottenham", "Liverpool", "Arsenal", "Chelsea"]
let tottenham = eplTeam.remove(at: 0)
// ["Liverpool", "Arsenal", "Chelsea"]
firstTeam = eplTeam[0]
// firstTeam : "Liverpool"
let chelsea = eplTeam.removeLast()
// ["Liverpool", "Arsenal"]
✔️ 위의 예제와 같이 여러 메소드를 이용하여 특정 위치에 원소를 추가, 삭제, 접근할 수 있다.
1️⃣ arr.insert(item, at: index) : 배열의 특정 index에 item을 추가한다.
2️⃣ arr.remoive(at: index) : 배열의 특정 index의 아이템을 삭제한다.
3️⃣ arr[index] : 배열의 특정 index에 접근한다.
4️⃣ arr.removeLast() : 배열의 마지막 index의 아이템을 삭제한다.
var names = ["Yeo", "Kim", "Lee"]
for item in names {
print(item)
}
// Yeo
// Kim
// Lee
✔️ 위의 예제와 같이 for-in loop를 이용해 배열을 순회할 수 있다.
var names = ["Yeo", "Kim", "Lee"]
for (index, value) in names.enumerated() {
print("name \(index + 1): \(value)")
}
// name 1 : Yeo
// name 2 : Kim
// name 3 : Lee
✔️ 위의 예제와 같이 배열의 값과 인덱스가 필요할 때는 enumerated() 메소드를 사용한다.
셋 (Sets)
셋 (Set) : 순서가 없으며, 각 요소들이 독립적인 컬렉션이다.
✅ 순서가 없는 컬렉션이다. 순서를 고려하지 않을때 사용한다.
✅ 컬렉션 내에서 각 요소들이 중복된 값 없이 오직 한 개만 있다는 것을 보장할 때 사용한다.
✅ Set 형태로 저장되기 위해서는 반드시 타입이 hashable 이어야 한다. 스위프트에서 String, Int, Double, Bool 같은 기본 타입은 기본적으로 hashable이다. 스위프트에서 Set 타입은 Set으로 선언한다.
var alphabet = Set<Character>()
print("alphabet is of type Set<Character> with \(letters.count) items.")
// alphabet is of type Set<Character> with 0 items.
alphabet.insert("a")
// alphabet = ["A"]
alphabet.insert("BBB")
// ERR. Character타입의 Set에 String타입의 아이템을 삽입하려고 했기 때문
alphabet = []
// alphabet = []
✔️ 위의 예제와 같이 빈 Set을 생성할 수 있다.
✅ Set<Type>()
var favoriteFood: Set<String> = ["PorkBelly", "Chicken", "Ramen"]
✔️위의 예제와 같이 배열 리터럴을 이용해 Set을 생성할 수 있다.
var favoriteMovie: Set = ["My Tomorrow, Your Yesterday", "Spotlight", "Catch Me If You Can"]
✔️ 위의 예제와 같이 타입을 명시하지 않고 타입추론으로 Set을 생성할 수 있다.
var favoriteMovie: Set = ["My Tomorrow, Your Yesterday", "Spotlight", "Catch Me If You Can"]
print("The favoriteMovie list contains \(favoriteMove.count) items.")
// The favoriteMovie list contains 3 items.
✔️ 위의 예제와 같이 count 메소드를 이용해서 Set의 원소 개수를 확인할수 있다.
var favoriteMovie: Set = ["My Tomorrow, Your Yesterday", "Spotlight", "Catch Me If You Can"]
if favoriteMovie.isEmpty {
print("empty")
} else {
print("not empty")
}
// not empty
✔️ 위의 예제와 같이 isEmpty 메소드를 이용해서 Set이 비었는지 확인할 수 있다.
var favoriteMovie: Set = ["My Tomorrow, Your Yesterday", "Spotlight", "Catch Me If You Can"]
favoriteMovie.insert("No Country for Old Men")
favoriteMovie.remove("Spotlight")
✔️위의 예제와 같이 insert 메소드와 remove 메소드를 이용해 Set에 원소를 추가하거나 삭제할 수 있다.
1️⃣ Set.insert(item) : Set에 item을 추가한다.
2️⃣ Set.remove(item) : Set에 있는 item을 삭제한다.
var favoriteMovie: Set = ["My Tomorrow, Your Yesterday", "Spotlight", "Catch Me If You Can"]
if favoriteMovie.contains("Spotlight") {
print("contains")
} else {
print("not contains")
}
// contains
✔️ 위의 예제와 같이 contains 메소드를 이용해서 Set에 값이 있는지 확인할 수 있다.
var favoriteMovie: Set = ["My Tomorrow, Your Yesterday", "Spotlight", "Catch Me If You Can"]
for movies in favoriteMovie {
print(movies)
}
// My Tomorrow, Your Yesterday
// Catch Me If You Can
// Spotlight
✔️ 위의 예제와 같이 for-in loop를 이용해 Set을 순회할 수 있다.
var numbers: Set = [10, 7, 1, 2, 5]
numbers.sorted()
// numbers : [1, 2, 5, 7, 10]
numbers.sorted(by: >)
// numbers : [10, 7, 5, 2, 1]
✔️ 위의 예제와 같이 sorted() 메소드를 이용해서 정렬할 수 있다.
1️⃣ Set.sorted(by: <) : 오름차순으로 정렬한다. by: <는 생략가능하다. 기본 값은 오름차순이다.
2️⃣ Set.sorted(by: >) : 내림차순으로 정렬한다.
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
✔️ 위의 예제와 같이 집합 연산을 할 수 있다.
1️⃣ 합집합 (A∪B) : 두 집합에 있는 요소를 모두 포함시킨다.
➡️ Set.union(targetSet) : 두 Set의 합집합으로 새로운 Set을 만들어 반환한다.
➡️ Set.formUnion(targetSet) : 두 Set의 합집합으로 원본 Set을 업데이트한다.
2️⃣ 교집합 (A∩B) : 두 집합에 공통적으로 있는 요소를 포함시킨다.
➡️ Set.intersection(targetSet) : 두 Set의 교집합으로 새로운 Set을 만들어 반환한다.
➡️ Set.formIntersection(targetSet) : 두 Set의 교집합으로 원본 Set을 업데이트한다.
3️⃣ 차집합 (A-B) : A 집합에서 B 집합의 원소를 제외한다.
➡️ Set.subtracting(targetSet) : 원본 Set에서 주어진 Set에 포함되지 않는 원소로 새로운 Set을 만들어 반환한다.
➡️ Set.subtract(targetSet) : 원본 Set에서 주어진 Set의 원소를 삭제한다.
4️⃣ 여집합 (A∪B - A∩B) : 두 집합의 전체 집합에서 두 집합에 공통으로 있는 요소를 제외한다.
Set.symmetricDifference(targetSet) : 두 Set의 여집합으로 새로운 Set을 만들어 반환한다.
Set.formSymmetricDifference(targetSet) : 두 Set의 여집합으로 원본 Set을 업데이트한다.
let liverpool: Set = ["Salah", "vanDijk", "Henderson"]
let liverpoolCaptain: Set = ["Henderson"]
let engSoccerPlayer: Set = ["Henderson"]
let tottenham: Set = ["Son", "Kane"]
let Arsenal: Set = ["Saka", "Ødegaard"]
liverpool.isSubset(of: tottenham) // false
liverpool.isSubset(of: liverpoolCaptain) // false
liverpoolCaptain.isSubset(of: liverpool) // true
liverpool.isSuperset(of: liverpoolCaptain) // true
tottenham.isSuperset(of: liverpool) // false
liverpoolCaptain.isDisjoint(with: engSoccerPlayer) // false
tottenham.isDisjoint(with: Arsenal) // true
✔️ 위의 예제와 같이 여러 메소드를 이용해 포함관계를 확인할 수 있다.
1️⃣ set.isSubSet(of: targetSet) : 특정 Set 컬렉션이 다른 Set 컬렉션을 subSet으로 가지는지 확인한다. 부분 집합;
2️⃣ set.isSuperset(of: targetSet) : setA.isSuperset(of: setB)는 setA가 setB의 부모셋, setB의 요소를 포함하고 있는지 확인한다. 상위 집합;
3️⃣ set.isDisjoint(with: targetSet) : 특정 set이 인자로 설정되는 비교대상 set과 어떤 교집합 요소도 없을 경우 true를 반환하고, 교집합 요소가 있으면 false를 반환함. 같은 집합/서로수 집합;
4️⃣ set.isStrictSubset(of: targetSet) : isSubset(of:) 메소드에서 비교하는 두 개의 set이 동일하지 않는지까지 체크하는 메소드이다. 만약 setA가 setB의 subSet인데 서로 동일한 요소를 가지고 있다면 false를 반환한다. 즉, 두 개의 set이 동일한 요소/크기를 갖지 않으면서 subSet인지를 체크하는 메소드이다.
let numSet1: Set = [1, 2, 7, 10]
let numSet2: Set = [2, 7, 1, 10]
numSet1 == numSet2 // true
✔️ 위의 예제와 같이 == 연산자를 이용해 두 개의 Set이 동일한 요소를 가지고 있는지 확인할 수 있다. Set은 순서가 없으므로 요소의 순서가 달라도 요소의 값만 같으면 true를 반환한다.
사전 (Dictionaries)
사전 (Dictionaries) : 키-값 쌍으로 순서가 없는 저장되는 컬렉션.
✅ 키로 접근하면 값을 확인할 수 있다.
✅ 키로는 hashable인 값을 사용할 수 있다.
var dict1 = [Int: String]()
dict1[0] = "zero"
var dict2 = [:]
var dict3: Dictionary = [String: int]()
var dict4: Dictionary<String, Int> = Dictionary<String, Int>()
✔️ 위의 예제와 같이 빈 Dictionary을 생성할 수 있다.
var anymal: [Int: String] = [1: "puppy", 2: "cat"]
var numbers: [String: Int] = ["one": 1, "two": 2]
var empty: [Int: Int] = [:]
✔️ 위의 예제와 같이 리터럴을 이용해서 Dictionary을 생성할 수 있다.
var numbers: [String: Int] = ["one": 1, "two": 2]
print("The numbers dictionary contains \(numbers.count) items.")
// The numbers dictionary contains 2 items.
✔️ 위의 예제와 같이 count 메소드를 이용해서 Dictionary의 원소 개수를 확인할수 있다.
var numbers: [String: Int] = ["one": 1, "two": 2]
if numbers.isEmpty {
print("empty")
} else {
print("not empty")
}
// not empty
✔️위의 예제와 같이 isEmpty 메소드를 이용해서 Dictionary가 비었는지 확인할 수 있다.
var numbers: [String: Int] = ["one": 1, "two": 2]
numbers["three"] = 3
✔️ 위의 예제와 같이 dictionary[key] = value를 사용하여 값을 추가할 수 있다.
var numDict = ["primes": [2,3,5], "triangular": [1,3,6]]
// Dictionary<String, Array<Int>>.Type
✔️ 위의 예제와 같이 한개의 key에 여러 value를 가질수 있는 Dictionary를 생성할 수 있다.
var numDict = ["primes": [2,3,5], "triangular": [1,3,6]]
numDict["Even"] = [2]
// numDict = ["primes": [2,3,5], "triangular": [1,3,6], "Even": [2]]
numDict["Odd"] = ["One"] // ERR. Int타입 Array value에 String 타입을 추가하려 했기 때문;
numDict.updateValue([7], forKey: "primes")
✔️ 위의 예제와 같이 dictionary.updateValue(value, forKey: key) 메소드를 사용하여 값을 추가할 수 있다.
var numDict = ["primes": [2,3,5], "triangular": [1,3,6]]
numDict.removeValue(forKey: "primes")
// numDict : ["triangular": [1,3,6]]
numDict.removeAll()
// numDict : [:]
✔️ 위의 예제와 같이 dictionary.removeValue(forKey: key) 메소드와 dictionary.removeAll() 메소드를 이용해서 값을 삭제할 수 있다.
1️⃣ dictionary.removeValue(forKey: key) : 원하는 키에 대한 값만 제거한다.
2️⃣ dictionary.removeAll() : 모든 키와 값을 제거한다.
var numDict = ["primes": [2,3,5], "triangular": [1,3,6]]
for (key, value) in numDict {
print("key: \(key) and value: \(value)")
}
key: primes and value: [2,3,5]
key: triangular and value: [1,3,6]
✔️ 위의 예제와 같이 for-in loop를 이용해서 dictionary의 key-value를 모두 가져올 수 있다.
'Swift > Swift 기본기' 카테고리의 다른 글
06. 클로저 (Closures) (0) | 2023.03.18 |
---|---|
05. 함수 (Functions) (0) | 2023.03.18 |
04. 제어문 (Control Flow) (0) | 2023.03.17 |
02. 문자열과 문자 (Strings and Characters) (0) | 2023.03.16 |
01. 기본 연산자 (Basic Operators) (1) | 2023.03.15 |