iOS Development/Swift

[Swift] #4 - Collections

se0m 2021. 8. 30. 14:54

** Collections, 집단 자료형

  • 서로 관련이 있는 데이터끼리 모아서 관리
  • 다데이터를 그룹단위로 묶을 수 있으므로 다량의 데이터를 다룰 때 편리함
  • 배열(Array): 일련번호로 구분되는 순서에 따라 데이터가 정렬된 목록 형태의 자료형
  • 집합(Set): 중복되지 않은 데이터을 모은 집합 형태의 자료형
  • 튜플(Tuple): 종류에 상관없이 데이터들을 모은 자료형, 수정 및 삭제를 할 수 없음(Immutable)
  • 딕셔너리(Dictionary): 키(key)-값(value) 쌍으로 연관된 데이터들을 순서 없이 모은 자료형

 

 

** Array

  • 선언과 초기화
// 선언 + 초기화O
var bts1 = ["진", "슈가", "제이홉", "RM", "지민", "V", "정국"]
let bts2 = ["진", "슈가", "제이홉", "RM", "지민", "V", "정국"]

var bts3:Array<String> = ["진", "슈가", "제이홉", "RM", "지민", "V", "정국"]
var bts4:[String] = ["김석진", "민윤기", "정호석", "김남준", "박지민", "김태형", "전정국"]

// 선언 + 초기화X
var bts5 = Array<String>()
var bts6 = [String]()
bts6.append("")
bts6.append("선우")

var bts7:[String] = [String]()
var bts8:[String] = []

// 선언 + 초기화O (반복문 사용)
var bts9 = Array(repeatElement(0, count: 3))
var bts10 = [String](repeatElement("없음", count: 3))

 

  • 다양한 활용
    • 배열은 순서가 중요하므로 원소를 삽입 및 삭제할 경우, 삽입할 위치를 지정해줘야 함 -> insert(at: ~), remove(at: ~)
    • append(), '+' 연산자: 맨 뒤에 삽입함
var bts = ["진", "슈가", "제이홉", "랩몬", "지민", "V", "정국"]

// 원소 접근
let member = bts[0]
print("첫번째 멤버는 \(member)입니다")

for member in bts {
    print(member)
}

let unit = bts[0...2]
print("Unit = \(unit)")

// 원소 변경
bts[3] = "RM"
bts[0...1] = ["JIN", "SUGA"]
print(bts)

// 배열 길이
let length = bts.count
print(length)

for i in 0...length-1 {
    print("\(i+1)번째 멤버는 \(bts[i])입니다.")
}

// 원소 추가
bts.append("방시혁")
print(bts)

bts.insert("누군가1", at: 0)
print(bts)

bts.append(contentsOf: ["누군가2", "누군가3"])
print(bts)

bts += ["누군가4", "누군가5"]
print(bts)

// 원소 삭제
bts.remove(at: bts.count-1)
print(bts)

 

 

 

** Set

  • 선언과 초기화
    • Set에서는 형 지정을 생략하면 Array로 인식됨
    • 출력시 random한 순서로 출력됨
// 선언 + 초기화X
var set1:Set<String> = Set<String>() // var set1 = Set<String>()
var set2:Set<String> = []

// 선언 + 초기화O
var set3:Set<String> = ["제니", "지수", "리사", "로제"]
print("BLACKPINK = \(set3)")

for name in set3 {
    print(name)
}

// Set은 형 지정 필수 ! 아니면 Array로 인식
var unknown = [1, 2, 3]
print("자료형: \(type(of: unknown))")

 

  • 다양한 활용
    • 위치 상관없이 random하게 삽입됨
    • 중복을 허용하지 않으므로 같은 값이 이미 존재하면 추가되지 않음
// 원소 추가
let newMember1 = set3.insert("소미")
print(newMember1) // 결과: (inserted: true, memberAfterInsert: "소미")

let newMember2 = set3.insert("제니")
print(newMember2) // 결과: (inserted: false, memberAfterInsert: "제니")
// 같은 값이 존재하면 추가 안됨

// 원소 삭제
let removeMember1 = set3.remove("소미")
print(removeMember1!) // Optional("소미")

let removeMember2 = set3.remove("소미")
print(removeMember2) // nil

let red:Set<String> = ["아이린", "슬기", "웬디"]
let belbet:Set<String> = ["조이", "예리"]

 

// 합집합
let unionSet = red.union(belbet)
print(unionSet)

// 교집합
let intersectionSet = red.intersection(belbet)
print(intersectionSet)

// 여집합
let symmetricDifferenceSet = unionSet.symmetricDifference(belbet)
print(symmetricDifferenceSet)

// 차집합
let subtractSet = unionSet.subtracting(red)
print(subtractSet)

// 정렬
print(red.sorted())

let students:Set<String> = ["덕선", "선우", "정환", "동룡", "가을", "왕조현", "장만옥"]
let 쌍문여고:Set<String> = ["덕선", "왕조현", "장만옥"]
let 쌍문고:Set<String> = ["선우", "정환", "동룡", "가을"]

// 부분 집합
쌍문여고.isSubset(of: students)
쌍문고.isSubset(of: students)

// 배타적 관계
쌍문여고.isDisjoint(with: 쌍문고)

// 초 집합 (상위 집합)
students.isSuperset(of: 쌍문고)

 

 

 

** Tuple

  • 선언 및 초기화
// 선언 및 초기화
let tpl1:(Int, Int) = (100, 100)
let tpl2:(Int, String, Int) = (100, "a", 200)
let tpl3:(Int, (String, String)) = (100, ("t", "y"))
let tpl4:(String) = ("Sample String")
let tpl5 = ("a", "b", 1, 1.25, true)

 

  • 다양한 활용
let tupleValue = ("a", "b", 1, 1.25, true)

// 원소 접근
tupleValue.0
tupleValue.1
tupleValue.2
tupleValue.3
tupleValue.4

// 원소 참조 ?
let (a, b, c, d, e) = tupleValue
print(a)
print(b)
print(c)
print(d)
print(e)

 

 

 

** Dictionary

  • 선언 및 초기화
  • 형을 생략해서 선언하는 방식을 자주 사용
  • ex) JSON 포맷
// 선언 및 초기화O
var capital = ["KR":"Seoul", "EN":"London", "FR":"Paris"]

// 선언 및 초기화X
var capital1:Dictionary<String, String>
capital1 = Dictionary<String, String>()

var capital2:Dictionary<String, String>
capital2 = Dictionary()

var capital3:[String:String]
capital3 = [String:String]()

var capital4:[String:String]
capital4 = [:] // 자주 사용

 

  • 다양한 활용
    • insert나 append 사용 안함
    • key는 중복되지 않음
var capital5 = ["US":"Washington"]

// 원소 추가
capital5.updateValue("Ottawa", forKey: "CN") // 자동완성에서 값 넣고 탭 누르면 키 입력으로 바로 넘어감
capital5.updateValue("Seoul", forKey: "KR")
capital5.updateValue("Incheon", forKey: "KR") // key는 중복이 안되므로 해당 key를 가진 원소 값을 수정
print(capital5)

// 원소 삭제
capital5.removeValue(forKey: "CN")
print(capital5)

// 원소 접근
capital5["US"]

// 원소 수정
capital5["KR"] = "Sejong"
capital5["JP"] = "Tokyo" // 해당 키를 갖는 원소가 없으므로 새로 추가됨
capital5["JP"] = nil // 원소 삭제
print(capital5)

// 원소 순회 탐색
for (country, capital) in capital5 {
    print("\(country)'s capital = \(capital)")
}

 

 

 

** Collections 간의 사용

// 배열 요소로 튜플 사용
var tArray:Array<(String, Int)> = [("a", 1), ("b", 2)]
print(tArray[1])

let t1 = tArray[0]
t1.0
t1.1

// 배열 요소로 딕셔너리 사용
var dArray:[[String:Int]] =  [["a":1, "b":2], ["c":3]]
print(dArray[0]["a"])

var dArray1:[[Int:Int]] = [[1:1, 2:2]]
print(dArray1)

// 튜플 요소로 배열 사용
var tuple:([String], Int) = (["제니", "지수"], 2)
print(tuple.0[1])

// 딕셔너리의 Value로 배열 사용
var dic:[String:[String]] = ["BP":["리사", "로제"]]
print(dic["BP"])