[swift] 컬렉션 타입

orzr·2023년 4월 5일
0

컬렉션 타입

많은 수의 데이터를 묶어서 저장하고 관리할 수 있는 데이터 타입

Array : 중복없이 데이터를 순서대로 나열한 컬렉션
Dictionary : 순서없이 데이터를 키와 값의 쌍으로 관리하는 컬렉션
Set : 순서없이 데이터를 중복을 허용하여 관리하는 컬렉션

Array

동일한 타입의 데이터를 일렬로 나열하여 저장하는 형태의 컬렉션 타입으로 순서가 존재한다. 같은 값이 존재할 수 있으며 요소의 삽입 및 삭제가 자유롭다.

// 빈 Array 생성!
var emptyArray: [Any] = [Any]()
var emptyArray: [Any] = Array<Any>()
var emptyArray: [Any] = []	// 배열 타입을 정확하게 명시해줬다면 []만 사용해도 됨

// Array 선언 방식 1
var characters: Array<String> = ["orzr", "dorothy", "toto"]

// Array 선언 방식 2
var age: [Int] = [25, 14, 5]

// 특정 요소의 인덱스 찾기
print(characters.index(of: "orzr")	// 0

// 특정 위치에 요소 추가
characters.insert("happy", at: 1)	// orzr happy dorothy toto

// 마지막 위치에 요소 추가
age.append(11)						// 25 14 5 11

// contentOf를 사용하여 여러개의 요소 삽입 가능!
characters.append(contentOf: ["sweet", "potato"])	// orzr happy dorothy toto sweet potato

// 요소 삭제 -> 삭제된 요소 반환됨
characters.removeLast()		// orzr happy dorothy toto sweet
characters.removeFirst()	// happy dorothy toto sweet
characters.remove(at: 0)	// dorothy toto sweet

// 특정 구간 확인 및 변경
print(age[1 ... 2])		// 14 5
age[1 ... 2] = [15, 7]	//age = [ 25, 15, 7, 11]

Array의 경우 인덱스를 벗어날 경우 오류가 발생한다!

Dictionary

Dictionary는 순서없이 키와 값의 쌍으로 구성된 컬렉션 타입이다. 키 값은 Dictionary내에 중복해서 사용할 수 없는 식별자 역할을 한다.

// 빈 Dictionary 생성!
var emptyDictionary: Dictionary<String, Int> = Dictionary<String, Int>()
var emptyDictionary: [String: Int] = [String: Int]()
var emptyDictionary: [String: Int] = [:]	//키와 값 타입을 정확히 명시해줬다면 [:]만 사용해도 됨

// Dictionary 선언 방식
var numberForName: ["orzr": 25, "dorothy": 100, "toto": 66] 

// 키 값으로 값 접근
numberForName["orzr"] = 100
print(numberForName["orzr"])	// 100
print(numberForName["happy"])	// nil

// 요소 추가
numberForName["happy"] = 99

// 요소 삭제 -> 삭제된 값이 반환됨 (키X 값만!)
print(numberForName.removeValue(forKey: "dorothy"))	// 100

Dictionary의 경우 Array와는 다르게 내부에 존재하지 않는 키로 접근해도 오류가 발생하지 않고 nil을 반환한다.

Set

같은 타입의 데이터를 순서 없이 저장하는 형태의 컬렉션 타입으로 중복된 값이 존재하지 않는다. 꼭 해시 가능한(hashable) 값을 가져야하며 기본 데이터 타입은 모두 hashable이다.

'해시 가능한'이라는 것은 swift 표준 라이브러리의 Hashable 프로코콜을 따른다는 것을 의미한다

Set은 Array와 마찬가지로 대괄호를 사용하기 때문에 타입 추론을 하게되면 Array로 타입을 지정하게 된다. 축약형은 없음

// 빈 Set 생성!
var characters: Set<String> = Set<String>()
var characters: Set<String> = []

// Set 선언 방식
var chracters: Set<String> = ["orzr", "dorothy", "toto"]

// 요소 추가
characters.insert("happy")

// 요소 삭제 -> 삭제된 요소 반환
characters.remove("dorothy")

타입 추론에 의존하게 되면 에러가 발생했을 경우 원인을 찾는것이 더욱 어려워질 수 있기 때문에 타입 추론은 지양하자!

Set은 집합 관계를 표현하고자 할 때 매우 유용하게 사용된다.

let intersect: Set<String> = A.intersection(B)		// A와 B의 교집합
let symmetric: Set<String> =A.symmetricDifference	// A와 B의 여집합
let union: Set<String> =A.union(B)					// A와 B의 합집합
let subtract: Set<String> =A.subtracting(B)			// A와 B의 차집합

// Bool 값을 반환
A.isDisjoint(with: B)	// 서로 배타적인지
A.isSubset(of: B)		// A가 B의 부분집합인지
A.isSuperset(of: B) 	// A가 B의 전체집합인지

출처 : 스위프트 프로그래밍 3판 (야곰)

profile

0개의 댓글