[머릿말]
Swift에도 배열이 존재하는데 다른 프로그래밍 언어에서 보았던 것과 전반적으로 비슷비슷 한 것 같다.
1. 배열(Array)
배열은 특정 타입의 값을 순서대로 저장한다. 즉, 배열에 저장된 각 값은 각각의 Index 값을 갖는다. 그러므로 중복되는 값도 얼마든지 저장할 수 있다.
1-1. 배열 선언 방법
배열은 다양한 방법을 사용하여 선언할 수 있다.
let arr1 = [Int]() // 가장 많이 사용되는 형식
let arr2: [Int] = []
let arr3: Array<Int> = []
let arr4 = [1, 2, 3, 4, 5]
위 방법을 사용하여 배열을 선언할 수 있고, arr1을 선언하는 방법이 제일 많이 사용되는 방법이다. arr3은 거의 사용되지 않는 방법이다. Swift는 type-safe 하기 때문에 배열에는 같은 타입의 값만 저장할 수 있다. 만약 모든 타입의 값을 저장할 수 있는 배열을 선언하고 싶다면 Any 타입으로 선언해주면 된다.
var arr = [Any]()
arr.append(1)
print(arr) // [1]
arr.append("ABC")
print(arr) // [1, "ABC"]
// var arr2 = [1, "ABC"] -> Error!
배열의 기본 값과 크기를 선언하는 방법도 있다. 기본 값이 될 요소를 repeating에 적고 크기를 count에 적으면 된다.
let arr1 = Array(repeating: 10, count: 3)
let arr2 = Array(repeating: ["A", "B", "C"], count: 2)
print(arr1) // [10, 10, 10]
print(arr2) // [["A", "B", "C"], ["A", "B", "C"]]
1-2. 배열의 병합
1-2-1. + 연산자
+ 연산자를 사용하여 서로 다른 여러 배열을 하나로 합칠 수 있다. 이때 연산에 사용되는 배열들의 타입은 일치해야 한다.
var arr1 = [1, 2, 3]
let arr2 = [4, 5, 6]
let arr3 = [7, 8, 9]
arr1 = arr1 + arr2 + arr3
print(arr1) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
1-2-2. append(contentsOf: )
append 메서드를 사용하면 배열의 맨 뒷부분에 새로운 요소를 추가할 수 있다. 이때 contestsOf: 키워드를 사용하면 배열을 추가할 수 있다.
var arr1 = [1, 2, 3]
let arr2 = [4, 5, 6]
let arr3 = [7, 8, 9]
arr1.append(contentsOf: arr2)
print(arr1) // [1, 2, 3, 4, 5, 6]
arr1.append(contentsOf: arr3)
print(arr1) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
1-3. count
count 속성(property)을 사용하면 배열의 길이(요소의 개수)를 확인할 수 있다. 자주 사용되는 속성이다.
var arr1 = [Int]()
var arr2 = [1, 2, 3]
print(arr1.count) // 0
print(arr2.count) // 3
1-4. isEmpty
isEmpty 속성은 배열에 아무런 요소가 없으면 true를, 하나 이상의 요소가 존재하면 false를 반환한다. 이 역시 자주 사용되는 속성이다.
var arr = ["Hello", "Swift"]
print(arr) // ["Hello", "Swift"]
print(arr.isEmpty) // false
print()
arr = []
print(arr) // []
print(arr.isEmpty) // true
1-5. 새로운 요소 추가
1-5-1. append( )
이미 위에서 다룬 것처럼 append() 메서드를 사용하면 배열의 맨 뒷부분에 새로운 요소를 추가할 수 있다.
var arr = [10]
arr.append(20)
print(arr) // [10, 20]
arr.append(contentsOf: [100, 200])
print(arr) // [10, 20, 100, 200]
1-5-2. insert( )
맨 뒷부분에 값이 추가되는 append 메서드와 달리 insert 메서드는 원하는 위치에 값을 추가할 수 있다. 이때 하나의 요소만 추가할 수 있다. 추가할 요소를 앞에 적고, at 키워드에 추가할 인덱스의 번호를 적으면 된다.
var arr = ["A", "B", "C", "D", "E"]
arr.insert("OOO", at: 2)
print(arr) // ["A", "B", "OOO", "C", "D", "E"]
arr.insert("HELLO", at: 0)
print(arr) // ["HELLO", "A", "B", "OOO", "C", "D", "E"]
1-6. 특정 요소에 접근하는 방법
앞서 말한 것처럼 배열은 순서를 갖으므로 각 요소별 인덱스가 존재한다. 이를 사용하여 요소에 접근할 수 있다. 만약 배열의 크기보다 큰 인덱스에 접근하려 하면 오류가 발생한다. Swift에서 배열의 시작 인덱스는 다른 언어와 동일하게 0이다.
var arr = [1, 2, 3, 4, 5]
print(arr[0]) // 1
print(arr[1]) // 2
print(arr[2]) // 3
print(arr[3]) // 4
print(arr[4]) // 5
// print(arr[5]) -> Fatal error: Index out of range
범위 연산자를 사용하여 특정 인덱스의 범위에 포함되는 모든 요소에 접근하는 것도 가능하다.
var arr = [1, 2, 3, 4, 5]
print(arr[0...2]) // [1, 2, 3]
print(arr[3..<5]) // [4, 5]
이러한 방법을 사용하여 요소의 값을 변경할 수도 있다.
var arr = [1, 2, 3, 4, 5]
arr[2...4] = [0, 0, 0]
print(arr) // [1, 2, 0, 0, 0]
arr[0] = 100
print(arr) // [100, 2, 0, 0, 0]
1-7. 기존 요소의 삭제
1-7-1. remove(at: )
이 방법을 사용하면 특정 인덱스에 해당하는 요소를 삭제할 수 있다.
var arr = [1, 2, 3, 4, 5]
arr.remove(at: 2) // 3 삭제
print(arr) // [1, 2, 4, 5]
1-7-2. removeAll()
전체 요소를 삭제하는 방법이다.
var arr = [1, 2, 3, 4, 5]
arr.removeAll()
print(arr) // []
1-7-3. removeFirst(), removeLast()
각각 배열의 맨 앞 요소와 맨 뒤 요소를 삭제하는 방법이다.
var arr = [1, 2, 3, 4, 5]
arr.removeFirst()
print(arr) // [2, 3, 4, 5]
arr.removeLast()
print(arr) // [2, 3, 4]
1-7-4. removeSubrange()
특정 범위의 전체 요소를 삭제하는 방법이다.
var arr = [1, 2, 3, 4, 5]
arr.removeSubrange(1...3)
print(arr) // [1, 5]
1-8. for ~ in
for 반복문을 사용하면 배열의 전체 요소를 앞에서부터 하나씩 모두 접근할 수 있다.
var arr = [1, 2, 3, 4, 5]
for item in arr {
print(item)
}
/*
1
2
3
4
5
*/
1-8-1. sorted()
배열의 요소를 오름차순 또는 내림차순으로 정렬하여 하나씩 접근할 수 있다.
var arr = [3, 1, 5, 2, 4]
for item in arr.sorted() { // 오름차순
print(item, terminator: " ")
}
// 1 2 3 4 5
print()
for item in arr.sorted(by: >) { // 내림차순
print(item, terminator: " ")
}
// 5 4 3 2 1
1-8-2. enumerated()
이 메서드는 배열의 인덱스와 그에 해당되는 값을 동시에 반환한다. 이때 for (index, value) in 처럼 반복 변수는 튜플 형태로 사용해야 한다.
var arr = [1, 2, 3, 4, 5]
for (i, v) in arr.enumerated() {
print("index: \(i), value: \(v)")
}
/*
index: 0, value: 1
index: 1, value: 2
index: 2, value: 3
index: 3, value: 4
index: 4, value: 5
*/
어느 언어든지간에 배열은 가장 기본이자 핵심이므로 내용을 잘 익혀두도록 해야겠다.
끝!