Swift는 데이터를 효율적으로 저장하고 접근할 수 있도록 세 가지 주요 컬렉션 타입을 제공합니다.
배열(Array), 세트(Set), 그리고 딕셔너리(Dictionary). 이 세 가지 중에서 오늘은 가장 빈번하게 사용되는 배열과 딕셔너리에 집중하여 마스터하는 시간을 갖겠습니다. 이들을 잘 활용하면 복잡한 데이터도 깔끔하게 정리하고 원하는 대로 다룰 수 있습니다.
1. 배열 (Array): 순서가 있는 리스트
배열은 동일한 타입의 값들을 순서대로 저장하는 리스트입니다. 각 값은 고유한 인덱스(index)를 가지며, 이 인덱스를 통해 특정 값에 접근할 수 있습니다. 배열의 인덱스는 항상 0부터 시작합니다.
💡 배열을 사용하는 경우:
- 항목의 순서가 중요할 때 (예: 할 일 목록, 점수 순위, 사진 갤러리).
- 특정 위치의 항목에 빠르게 접근해야 할 때.
1.1. 배열 생성 및 초기화
배열은 다양한 방법으로 생성하고 초기화할 수 있습니다.
내용이 없는 빈 배열을 생성하거나, 기본 초기값을 넣고 시작하는 경우, 빈공간으로 최소 몇개를 만들어 두는 경우가 있습니다.
//Swift 예시
// 1. 빈 배열 생성 (타입 명시)
var emptyIntArray: [Int] = []
var anotherEmptyIntArray = [Int]() // 축약형
// 2. 초기값을 이용한 배열 생성 (타입 추론)
var shoppingList = ["Milk", "Bread", "Eggs"] // String 타입 배열로 추론
var numbers = [1, 2, 3, 4, 5] // Int 타입 배열로 추론
// 3. 동일한 값으로 특정 크기의 배열 생성
var threeDoubles = Array(repeating: 0.0, count: 3) // [0.0, 0.0, 0.0]
1.2. 배열 접근 및 수정
배열의 요소는 인덱스를 통해 접근하고 수정할 수 있습니다.
//Swift 예시
var fruits = ["Apple", "Banana", "Cherry", "Durian"]
// 요소 개수 확인
print("과일 목록: \(fruits.count)개") // 출력: 과일 목록: 4개
// 특정 인덱스 접근
print("첫 번째 과일: \(fruits[0])") // 출력: 첫 번째 과일: Apple
print("세 번째 과일: \(fruits[2])") // 출력: 세 번째 과일: Cherry
// 값 수정
fruits[1] = "Mango" // Banana를 Mango로 변경
print(fruits) // 출력: ["Apple", "Mango", "Cherry", "Durian"]
// 범위 접근 (Subscript)
// fruits[1...2] = ["Grape", "Peach"] // ["Apple", "Grape", "Peach", "Durian"]
// print(fruits)
1.3. 배열에 요소 추가 및 제거
배열에 요소를 추가하거나 제거하는 다양한 메서드가 있습니다.
//Swift 예시
var dailyTasks = ["책 읽기", "운동하기"]
// 요소 추가
dailyTasks.append("코딩하기") // 맨 뒤에 추가
print(dailyTasks) // 출력: ["책 읽기", "운동하기", "코딩하기"]
dailyTasks.insert("명상하기", at: 0) // 특정 인덱스에 삽입
print(dailyTasks) // 출력: ["명상하기", "책 읽기", "운동하기", "코딩하기"]
// 요소 제거
let removedTask = dailyTasks.remove(at: 1) // 인덱스 1의 요소 제거 ("책 읽기" 제거)
print("제거된 작업: \(removedTask)") // 출력: 제거된 작업: 책 읽기
print(dailyTasks) // 출력: ["명상하기", "운동하기", "코딩하기"]
dailyTasks.removeLast() // 맨 마지막 요소 제거
print(dailyTasks) // 출력: ["명상하기", "운동하기"]
// dailyTasks.removeAll() // 모든 요소 제거
1.4. 배열 순회 (Iteration)
for-in 반복문을 사용하여 배열의 모든 요소를 쉽게 순회할 수 있습니다.
//Swift 예제
let students = ["민준", "서윤", "도윤"]
for student in students {
print("학생: \(student)")
}
// 출력:
// 학생: 민준
// 학생: 서윤
// 학생: 도윤
// 인덱스와 함께 순회하고 싶다면 `enumerated()` 사용
for (index, student) in students.enumerated() {
print("\(index + 1)번째 학생: \(student)")
}
// 출력:
// 1번째 학생: 민준
// 2번째 학생: 서윤
// 3번째 학생: 도윤
2. 딕셔너리 (Dictionary): 키-값 쌍의 컬렉션
딕셔너리는 순서 없이 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 컬렉션입니다. 각 '값'은 고유한 '키'에 연결되며, 이 '키'를 통해 해당 '값'에 빠르게 접근할 수 있습니다. 실생활의 사전처럼 단어(키)로 뜻(값)을 찾는 것과 유사합니다. 딕셔너리의 키는 반드시 해시 가능(Hashable)해야 합니다. (기본 타입들은 대부분 해시 가능합니다.)
💡 딕셔너리를 사용하는 경우:
- 항목의 순서보다는 고유한 식별자(키)를 통해 빠르게 값을 찾아야 할 때 (예: 사용자 ID에 해당하는 이름, 국가 코드에 해당하는 국가명).
- 이름-값 형태의 데이터를 저장할 때.
2.1. 딕셔너리 생성 및 초기화
딕셔너리 또한 다양한 방법으로 생성하고 초기화할 수 있습니다.
//Swift예시
// 1. 빈 딕셔너리 생성 (타입 명시: [KeyType: ValueType])
var emptyStringIntDict: [String: Int] = [:]
var anotherEmptyDict = [String: String]() // 축약형
// 2. 초기값을 이용한 딕셔너리 생성 (타입 추론)
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"] // [String: String]으로 추론
var studentScores = ["Alice": 95, "Bob": 88, "Charlie": 92] // [String: Int]로 추론
2.2. 딕셔너리 접근 및 수정
키를 사용하여 딕셔너리의 값에 접근하고 수정할 수 있습니다. 딕셔너리에서 값을 가져올 때는 해당 키가 존재하지 않을 수 있으므로, 옵셔널 타입으로 반환됩니다.
//Swift 예시
var capitals = ["Korea": "Seoul", "Japan": "Tokyo", "China": "Beijing"]
// 요소 개수 확인
print("국가 개수: \(capitals.count)개") // 출력: 국가 개수: 3개
// 키를 통해 값 접근 (옵셔널 반환)
if let capitalOfJapan = capitals["Japan"] {
print("일본의 수도는 \(capitalOfJapan)입니다.") // 출력: 일본의 수도는 Tokyo입니다.
} else {
print("일본의 수도를 찾을 수 없습니다.")
}
// 새로운 키-값 쌍 추가
capitals["France"] = "Paris"
print(capitals) // 출력: ["Korea": "Seoul", "Japan": "Tokyo", "China": "Beijing", "France": "Paris"]
// 기존 값 수정
capitals["Korea"] = "세울" // "Seoul"을 "세울"로 수정
print(capitals) // 출력: ["Korea": "세울", "Japan": "Tokyo", "China": "Beijing", "France": "Paris"]
// updateValue(_:forKey:) 메서드를 사용하여 추가/수정 및 이전 값 확인
// let oldCapital = capitals.updateValue("베이징", forKey: "China")
// print("이전 중국 수도: \(oldCapital ?? "없음")") // Optional("Beijing")
// print(capitals) // ["Korea": "세울", "Japan": "Tokyo", "China": "베이징", "France": "Paris"]
2.3. 딕셔너리에서 요소 제거
특정 키에 해당하는 값을 nil로 설정하거나 removeValue(forKey:) 메서드를 사용합니다.
//Swift 예제
var contactList = ["John": "123-4567", "Jane": "987-6543"]
// 키에 nil 할당하여 제거
contactList["John"] = nil // John 키와 값 제거
print(contactList) // 출력: ["Jane": "987-6543"]
// removeValue(forKey:) 메서드 사용
let removedNumber = contactList.removeValue(forKey: "Jane") // Jane 키와 값 제거
print("제거된 번호: \(removedNumber ?? "없음")") // 출력: 제거된 번호: Optional("987-6543")
print(contactList) // 출력: [:] (빈 딕셔너리)
2.4. 딕셔너리 순회 (Iteration)
for-in 반복문을 사용하여 딕셔너리의 모든 키-값 쌍을 순회할 수 있습니다.
//Swift 예제
let countriesAndCapitals = ["미국": "워싱턴 D.C.", "영국": "런던", "독일": "베를린"]
for (country, capital) in countriesAndCapitals {
print("나라: \(country), 수도: \(capital)")
}
// 출력 (순서는 보장되지 않음):
// 나라: 영국, 수도: 런던
// 나라: 독일, 수도: 베를린
// 나라: 미국, 수도: 워싱턴 D.C.
// 키만 순회
for countryName in countriesAndCapitals.keys {
print("나라 이름: \(countryName)")
}
// 값만 순회
for capitalName in countriesAndCapitals.values {
print("수도 이름: \(capitalName)")
}
정리하며
오늘은 Swift에서 여러 데이터를 효율적으로 묶고 관리하는 데 필수적인 컬렉션 타입 중 배열(Array)과 딕셔너리(Dictionary)에 대해 자세히 알아보았습니다.
배열(Array): 순서가 있는 동일 타입의 값 리스트로, 인덱스를 통해 접근합니다. 항목의 순서가 중요할 때 유용합니다.
딕셔너리(Dictionary): 순서가 없는 키-값 쌍의 컬렉션으로, 고유한 키를 통해 값에 접근합니다. 키를 통해 빠르게 값을 찾아야 할 때 유용합니다.
이 두 컬렉션 타입은 Swift 앱 개발에서 데이터를 다룰 때 가장 빈번하게 사용됩니다. 각자의 특징을 이해하고 상황에 맞춰 적절한 컬렉션 타입을 선택하는 것이 중요합니다. 다양한 데이터를 직접 배열과 딕셔너리에 담아보고 조작해보면서 감각을 익혀보세요!
0 comments:
댓글 쓰기