컬렉션 타입이 뭘까요?
이름은 거창하지만 데이터들을 묶어서 저장 및 관리를 할 수 있는 친구라고 생각하시면 됩니다.
해당 타입에 맞는 데이터들을 모아놓은 것이죠!
컬렉션 타입에는 배열(Array), 딕셔너리(Dictionary), 세트(Set)가 있지만,
먼저 배열에 대해서 알아보겠습니다.
배열의 생성
우선 FM으로 선언을 하면 아래와 같습니다.
// Int 데이터들의 집합인 상수형 배열
let intArr = Array<Int>()
// String 데이터들의 집합인 변수형 배열
var strArr = Array<String>()
이제 intArr에는 Int형의 데이터만, strArr에는 String형의 데이터만 올 수 있습니다!
하지만 매번 이렇게 쓰기 귀찮아 할 우리를 생각해서 축약형도 제공을 합니다.
let intArr = [Int]()
let strArr = [String]()
let anyArr = [Any]()
혹은 타입추론을 사용하여 생성을 할 수도 있습니다. (단 빈 배열을 생성할 경우에는 타입을 반드시 명시합니다.)
배열에 원소들을 넣어주면 Xcode의 컴파일러가 해당 배열 내의 데이터들을 확인하여 타입을 결정을 합니다.
여러가지 타입을 사용하고 싶다면 Any 타입을 사용하시면 됩니다.
// 타입추론에 의한 배열 생성
let intArr = [1, 2, 3, 4, 5, 6, 7]
let strArr = ["A", "B", "C", "D"]
// 여러 타입을 사용할 때에는 반드시 Any 타입을 명시해야 합니다!
let anyArr: [Any] = [1, "A", 3, "B"]
// [1, 2, 3, 4, 5]
let sequenceArr = Array(1...5)
// 여러가지 빈 배열 생성 방법
let emptyIntArr: [Int] = []
let emptyStrArr = Array<String>()
let emptyAnyArr = [Any]()
// 이렇게 사용 불가능! 빈 배열은 반드시 타입을 명시해야 합니다!
let emptyArr = []()
크기가 정해진 배열을 만들 수도 있습니다!
// repeating: 채울 데이터, count: 크기
// [0, 0, 0, 0, 0]
let intArr = [Int](repeating: 0, count: 5)
// ["A", "A", "A", "A", "A"]
let strArr = Array(repeating: "A", count: 5)
배열 검사
원소의 개수, 빈 배열인지를 체크할 수 있습니다.
let intArr = [1, 2, 3, 4, 5]
// 5
intArr.count
// false
intArr.isEmpty
원소 추가 / 삭제 / 접근
var intArr = [1, 2, 3, 4]
// 맨 마지막에 5라는 원소를 추가합니다.
intArr.append(5) // [1, 2, 3, 4, 5]
// 0번째 인덱스에 0이라는 원소를 추가합니다.
intArr.insert(0, at: 0) // [0, 1, 2, 3, 4, 5]
// 2번째 인덱스 원소를 제거합니다.
intArr.remove(at: 2) // [0, 1, 3, 4, 5]
// 첫번째 원소를 제거합니다.
intArr.removeFirst() // [1, 3, 4, 5]
// 마지막 원소를 제거합니다.
intArr.removeLast() // [1, 3, 4]
// 0~2번째 인덱스의 원소들을 2, 5로 바꿉니다. [1, 3, 4] -> [2, 5]
intArr[0...2] = [2, 5] // [2, 5]
// 0번째 인덱스 원소에 접근합니다.
intArr[0] // 2
배열의 순회
배열의 원소들을 출력하고 싶을 때 이렇게 하시면 됩니다!
절대로 제가 index와 element를 동시에 접근할 수 있는 enumerated()를 몰랐던 것은 아닙니다.
let intArr = [1, 2, 3, 4, 5]
// intArr를 순회하면서 순서대로 num을 출력합니다.
for num in intArr {
print("element: \(num)")
}
result
element: 1
element: 2
element: 3
element: 4
element: 5
// 배열의 값과 인덱스가 모두 필요할 경우!
for (index, num) in intArr.enumerated() {
print("\(index)번째 element: \(num)")
}
result
0번째 element: 1
1번째 element: 2
2번째 element: 3
3번째 element: 4
4번째 element: 5
배열의 정렬
let intArr = [4, 2, 6, 8, 5]
// intArr를 오름차순으로 정렬합니다.
let sortArr = intArr.sorted(by: <) // [2, 4, 5, 6 ,8]
하지만 아래의 경우에 score가 높은 순으로 정렬을 하고 싶을 때 어떻게 해야 할까요?
struct Student {
let name: String
let score: Int
}
let student1 = Student(name: "A", score: 85)
let student2 = Student(name: "B", score: 45)
let student3 = Student(name: "C", score: 63)
let student4 = Student(name: "D", score: 92)
let student5 = Student(name: "E", score: 81)
let studentArr = [student1, student2, student3, student4, student5]
사실 .sorted(by:)는 클로저인데 축약을 해서 위의 예시처럼 사용할 수 있던 겁니다!
이 부분은 다음에 다루도록 하고... 방법을 보면...!
let sortArr = studentArr.sorted(by: { student1, student2 in
return student1.score > student2.score
})
// 축약 (return도 생략이 가능합니다)
let sortArr = studentArr.sorted(by: {
return $0.score > $1.score
})
이렇게 사용할 수 있겠네요!
클로저에 대해서도 야무지게 공부를 해야겠다는 생각이 들었습니다... 허허...
'iOS > 자료구조' 카테고리의 다른 글
swift - Collection Types(2) Set (선언 / 추가 / 삭제 / 여러가지 메소드) (0) | 2023.02.20 |
---|