🔥 Array

1027자
12분

Array는 순서가 있는 리스트에 같은 타입의 값들을 저장하는 자료 구조입니다. 같은 값이 Array의 다른 위치에 여러번 나타날 수도 있어요.

Array 타입의 축약 문법

Swift에서 Array의 타입은 Array<Element>로 작성하는데, 여기서 Element는 Array에 저장할 수 있는 값의 타입입니다. Array의 타입은 [Element]와 같이 축약형으로도 작성할 수 있습니다. 두 형태는 기능적으로 동일하지만, 축약형이 선호되며 이 가이드에서 Array의 타입을 언급할 때 사용됩니다.

빈 Array 생성하기

특정 타입의 빈 Array를 생성하려면 초기자 문법을 사용하면 됩니다.

var someInts: [Int] = []
print("someInts is of type [Int] with \(someInts.count) items.")
// "someInts is of type [Int] with 0 items."를 출력합니다.
swift

someInts 변수의 타입은 초기자의 타입에서 [Int]로 추론됩니다.

또는 이미 타입 정보를 제공하는 상황이라면, 함수의 인자나 이미 타입이 지정된 변수 또는 상수 등, 빈 Array 리터럴([])을 사용해서 빈 Array를 생성할 수 있습니다.

someInts.append(3)
// someInts에는 이제 Int 타입의 값 1개가 포함됩니다.
someInts = []
// someInts는 이제 빈 Array이지만, 여전히 [Int] 타입입니다.
 
swift

기본 값으로 Array 생성하기

Swift의 Array 타입은 특정 크기의 Array를 생성하고 모든 값을 동일한 기본값으로 설정할 수 있는 초기자도 제공합니다. 이 초기자에 적절한 타입의 기본값(repeating이라고 함)과 새 Array에서 해당 값이 반복되는 횟수(count라고 함)를 전달하시면 됩니다.

var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles의 타입은 [Double]이며, [0.0, 0.0, 0.0]과 같습니다.
 
swift

두 Array를 서로 더해 Array 생성하기

호환 가능한 타입의 기존 Array 두 개를 더하기 연산자(+)로 더해서 새로운 Array를 생성할 수 있습니다. 새 Array의 타입은 더할 두 Array의 타입에서 추론됩니다.

var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles의 타입은 [Double]이며, [2.5, 2.5, 2.5]와 같습니다.
 
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles는 [Double]로 추론되며, [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]와 같습니다.
swift

Array 리터럴로 Array 생성하기

Array 리터럴을 사용해서 Array를 초기화할 수도 있는데, 이는 하나 이상의 값을 Array 컬렉션으로 작성하는 축약 방법입니다. Array 리터럴은 대괄호 한 쌍으로 둘러싸인 쉼표로 구분된 값 목록으로 작성됩니다.

[<#value 1#>, <#value 2#>, <#value 3#>]
swift

아래 예제는 String 값을 저장하기 위해 shoppingList라는 Array를 생성합니다.

var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList가 2개의 초기 항목으로 초기화되었습니다.
swift

shoppingList 변수는 [String]으로 작성된 "String 값들의 Array"로 선언됩니다. 이 특정 Array는 String 값의 타입을 지정했기 때문에 String 값만 저장할 수 있습니다. 여기서 shoppingList Array는 Array 리터럴 내에 작성된 두 개의 String 값("Eggs""Milk")으로 초기화됩니다.

이 경우 Array 리터럴은 두 개의 String 값과 그 외 다른 것은 포함하지 않습니다. 이는 shoppingList 변수의 선언 타입(오직 String 값만 포함할 수 있는 Array)과 일치하므로 두 개의 초기 항목으로 shoppingList를 초기화하는 방법으로 Array 리터럴을 할당할 수 있습니다.

Swift의 타입 추론 덕분에 같은 타입의 값을 포함하는 Array 리터럴로 초기화하는 경우 Array의 타입을 작성할 필요가 없습니다. shoppingList의 초기화를 더 짧은 형식으로 작성할 수도 있겠죠.

var shoppingList = ["Eggs", "Milk"]
swift

Array 리터럴의 모든 값이 같은 타입이기 때문에 Swift는 shoppingList 변수에 사용할 올바른 타입이 [String]임을 추론할 수 있습니다.

Array에 접근하고 수정하기

Array의 메서드와 속성을 통해 또는 subscript 문법을 사용해서 Array에 접근하고 수정할 수 있습니다.

Array에 있는 항목의 개수를 알아내려면 읽기 전용 count 속성을 확인하세요.

print("The shopping list contains \(shoppingList.count) items.")
// "The shopping list contains 2 items."을 출력합니다.
swift

count 속성이 0과 같은지 확인하는 지름길로 Boolean isEmpty 속성을 사용하세요.

if shoppingList.isEmpty {
    print("The shopping list is empty.")
} else {
    print("The shopping list isn't empty.")
}
// "The shopping list isn't empty."를 출력합니다.
swift

Array의 append(_:) 메서드를 호출하여 Array 끝에 새로운 항목을 추가할 수 있습니다.

shoppingList.append("Flour")
// shoppingList에는 이제 3개의 항목이 포함되고, 누군가 팬케이크를 만들고 있군요.
swift

또는 추가 할당 연산자(+=)를 사용해서 하나 이상의 호환되는 항목의 Array를 추가할 수 있습니다.

shoppingList += ["Baking Powder"]
// shoppingList에는 이제 4개의 항목이 포함됩니다.
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList에는 이제 7개의 항목이 포함됩니다.
swift

subscript 문법을 사용해서 Array에서 값을 검색할 수 있습니다. 검색하려는 값의 index를 Array 이름 바로 뒤의 대괄호 안에 전달하세요.

var firstItem = shoppingList[0]
// firstItem은 "Eggs"와 같습니다.
swift

subscript 문법을 사용하여 주어진 index에서 기존 값을 변경할 수도 있습니다.

shoppingList[0] = "Six eggs"
// 목록의 첫 번째 항목이 이제 "Eggs" 대신 "Six eggs"와 같습니다.
swift

subscript 문법을 사용할 때는 지정한 index가 유효해야 합니다. 예를 들어, shoppingList[shoppingList.count] = "Salt"를 작성하여 Array 끝에 항목을 추가하려고 하면 런타임 에러가 발생합니다!

subscript 문법을 사용하여 한 번에 값의 범위를 변경할 수도 있는데, 대체할 값 집합이 대체하려는 범위의 길이와 달라도 가능합니다. 다음 예제는 "Chocolate Spread", "Cheese""Butter""Bananas""Apples"로 대체합니다.

shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList에는 이제 6개의 항목이 포함됩니다.
swift

지정된 index에 항목을 Array에 삽입하려면, Array의 insert(_:at:) 메서드를 호출하세요.

shoppingList.insert("Maple Syrup", at: 0)
// shoppingList에는 이제 7개의 항목이 포함됩니다.
// "Maple Syrup"은 이제 목록의 첫 번째 항목입니다.
swift

insert(_:at:) 메서드 호출은 0으로 표시되는 매우 앞쪽에 값이 "Maple Syrup"인 새 항목을 삽입합니다.

비슷하게 remove(at:) 메서드로 Array에서 항목을 제거합니다. 이 메서드는 지정된 index에서 항목을 제거하고 제거된 항목을 반환합니다. (반환된 값이 필요하지 않다면 무시할 수 있습니다.)

let mapleSyrup = shoppingList.remove(at: 0)
// index 0에 있던 항목이 방금 제거되었습니다.
// shoppingList에는 이제 6개의 항목이 포함되며, Maple Syrup은 없습니다.
// mapleSyrup 상수는 이제 제거된 "Maple Syrup" 문자열과 같습니다.
swift

항목이 제거되면 Array의 간격이 메워지므로, index 0의 값은 다시 "Six eggs"와 같습니다:

firstItem = shoppingList[0]
// firstItem은 이제 "Six eggs"와 같습니다.
swift

Array의 마지막 항목을 제거하려면 Array의 count 속성을 조회할 필요가 없도록 remove(at:) 메서드 대신 removeLast() 메서드를 사용하세요. remove(at:) 메서드와 마찬가지로 removeLast() 메서드는 제거된 항목을 반환합니다.

let apples = shoppingList.removeLast()
// Array의 마지막 항목이 방금 제거되었습니다.
// shoppingList에는 이제 5개의 항목이 포함되며, apples는 없습니다.
// apples 상수는 이제 제거된 "Apples" 문자열과 같습니다.
swift

Array에 동작을 반복하기

for-in 루프를 사용하여 Array의 전체 값 집합에 동작을 반복할 수 있습니다.

for item in shoppingList {
    print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Banana
swift

각 항목의 정수 index와 값이 모두 필요한 경우 enumerated() 메서드를 대신 사용하여 Array에 동작을 반복하세요. Array의 각 항목에 대해 enumerated() 메서드는 정수와 항목으로 구성된 튜플을 반환합니다. 정수는 0에서 시작하여 각 항목에 대해 1씩 증가합니다. 전체 Array에 동작을 반복하는 경우 이 정수는 항목의 index와 일치합니다. 반복의 일부로 튜플을 임시 상수나 변수로 분해할 수 있습니다.

for (index, value) in shoppingList.enumerated() {
    print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas
swift

for-in 루프에 대한 자세한 내용은 For-In 루프를 참고하세요.

이상으로 Swift에서 Array에 대해 알아보았습니다. 순서가 있는 컬렉션으로서 Array가 어떻게 동작하는지 꼭 이해하셔야 합니다.