생각, 고민, 문제해결의 기록

[iOS/Swift] 컬렉션 타입(Collection Type) 본문

iOS/Swift

[iOS/Swift] 컬렉션 타입(Collection Type)

김예티 2022. 10. 20. 07:48

컬렉션 타입?

데이터를 묶어서 저장하고 관리할 수 있는 기능을 제공

대표적으로 Array, Dictionary, Set, Tuple 등이 있다.

 


Array (배열)

같은 타입의 데이터를 나열한 후 순서대로 저장하는 형태의 컬렉션 타입.

중복 값을 허용하고 각 요소마다 인덱스를 통해 접근할 수 있다.

잘못된 인덱스로 접근하려고하면 Exception Error가 발생한다.

ar names: [String] = ["Toby", "smith", "mark", "adam"]    // 배열 선언
print(names[2])     // 인덱스로 확인 "mark"
// print(names[4])      // 인덱스 범위 밖이라 오류 발생
names.append("elsa")   // 배열 끝에 값 저장
names.append(contentsOf: ["max", "john"])   // 여러 값 저장
names.insert("corin", at: 0)  // 지정 인덱스에 값 저장
names.insert(contentsOf: ["zini", "cona"], at: 3) // 지정 인덱스에 여러 값 저장
print(names[6])  // "adam"
names.firstIndex(of: "vill")     // 배열의 앞에서부터 조회해서 해당하는 값의 인덱스를 반환
names.lastIndex(of: "vill")      // 배열의 뒤에서부터 조회해서 해당하는 값의 인덱스를 반환
names.first     // 첫번째 인덱스 값 반환
names.last      // 마지막 인덱스 값 반환
print(names)
// ["corin", "Toby", "smith", "zini", "cona", "mark", "adam", "elsa", "max", "john"]
names.removeFirst()     // 첫번째 인덱스 값 삭제
names.removeLast()      // 마지막 인덱스 값 삭제
print(names)  // ["Toby", "smith", "zini", "cona", "mark", "adam", "elsa", "max"]

Dictionary (딕셔너리)

요소들이 순서 없이 key와 value의 쌍으로 구성되는 컬렉션 타입.

항상 [key:value]의 형태를 띄고 각 key마다의 value값은 중복될 수 있지만

key값은 중복해서 사용할 수 없다.

내부에 존재하지 않는 key로 접근해도 오류가 발생하지 않고 nil값을 반환한다.

var numberForName: [String:Int] = [:]   // 빈 딕셔너리 선언
typealias StringIntDict = [String:Int]   // 타입별칭으로 딕셔너리형태에 이름 부여 가능
// var numberForName: StringIntDict = StringIntDict()    // 타입별칭으로 선언
var ageInfo: [String:Int] = ["Toby":27, "robert":33]     // 초깃값 저장 후 생성
ageInfo["Toby"] // 27
ageInfo["king"] // nil
ageInfo.removeValue(forKey: "robert") // 해당 key값 삭제
ageInfo.removeValue(forKey: "robert") // 이미 삭제된 value라 nil 반환
print(ageInfo)		// ["Toby": 27]
ageInfo["max"] = 99     // max라는 key로 value 추가
print(ageInfo)		// ["max": 99, "Toby": 27]

Set (세트)

같은 타입의 데이터를 순서 없이 하나의 묶음으로 저장하는 형태의 컬렉션 타입.

중복값이 존재하지 않기 때문에 보통 순서가 중요하지 않거나 각 요소가 유일한 값이어야하는 경우에 사용된다.

세트의 요소로는 hashable한 값이 들어와야 한다.

var emptySet: Set<String> = []  // 빈 세트 생성
var setNames: Set<String> = ["AA", "BB", "CC", "AA"]    // 대괄호로 값 추가
setNames.count      // 중복 값 불가라서 3
var nums = [100, 200, 300] 
// Array와 선언방식이 동일하기 때문에 타입추론을 사용하게 되면 컴파일러는 Set이 아닌 Array타입으로 생성한다
setNames.insert("DD")   // 값 추가
setNames.remove("AA")   // 값 제거
print(setNames)		// ["CC", "BB", "DD"]   // 순서가 없기 때문에 컴파일할 때마다 임의로 순서가 바뀜

 

세트는 내부의 값들이 모두 유일한 값이므로 집합관계를 표현하고자 할때 매우 용이하다.

let abc: Set<String> = ["AA", "BB", "CC"]
let cde: Set<String> = ["CC", "DD", "EE"]
// 교집합
let intersectSet: Set<String> = abc.intersection(cde)            // {"CC"}
// 여집합
let symmetricDiffSet: Set<String> = abc.symmetricDifference(cde) // {"BB", "EE", "AA", "DD"}
// 합집합
let unionSet: Set<String> = abc.union(cde)                       // {"BB", "AA", "CC", "EE", "DD"}
// 차집합
let subtractSet: Set<String> = abc.subtracting(cde)              // {"BB", "AA"}
// 정렬된 형태로 반환	
unionSet.sorted() // ["AA", "BB", "CC", "DD", "EE"]

 

세트를 활용해 포함관계도 연산할 수 있다.

let bird: Set<String> = ["chicken", "eagle", "pigeon"]
let animal: Set<String> = ["tiger", "bear", "lion"]
let unionAnimal: Set<String> = bird.union(animal)  // 합집합
print(unionAnimal)		// ["lion", "pigeon", "bear", "tiger", "eagle", "chicken"]
bird.isDisjoint(with: animal) // 공통되는 요소가 있는지? true
bird.isSubset(of: unionAnimal)  // bird가 unionAnimal의 부분집합인지? true
unionAnimal.isSubset(of: animal) // unionAnimal은 animal의 전체집합인지? true

'iOS > Swift' 카테고리의 다른 글

[iOS/Swift] 연산자(Operators)  (0) 2022.10.24
[iOS/Swift] 클로저(Closures)  (0) 2022.10.11
[iOS/Swift] 구조체(Struct)와 클래스(Class)  (0) 2022.08.14