[Swift] Array (배열)

Array(배열)이란?

정렬된 목록에 같은 Type의 값을 저장하는 자료구조 Collection이다.

중복된 값이 허용되는 자주 사용하는 자료구조!

Swift에서 Array

Swift에서 배열을 생성하는 기본적인 문법은 다음과 같다

(var / let) 변수명 : Array<Element> = Array<Element>()

여기서 는 배열에 들어가는 Type이다. 예를 들어

var intArray : Array<Int> = Array<Int>() // Int 배열
var stringArray : Array<String> = Array<String>() // String 배열
var doubleArray : Array<Double> = Array<Double>() // Double 배열

이렇듯 Int, String, Double등 모든 Type에 대하여 배열을 만들 수 있고, 추후 공부할 Struct, Class, 프로토콜등의 Type도 배열로 사용할 수 있다. 이러한 형태를 Generic이라고 하는데 이는 추후에 다시 공부할 계획!!

지금은 Array에 집중을 해보자!

기본적인 Array의 선언은 위와 같은데 딱봐도 너무 길다… 좀 줄여 보자 !

Swift는 타입 추론이라는 기능을 지원하는데 이러한 기능은 해당 변수가 어떤 Type인지 명시하지 않아도 Swift가 알아서 척척 해당 Type을 유추해주는 훌륭한 기능이다. 따라서 Type을 생략할 수 있다

// var intArray ~~: Array<Int>~~ = Array<Int>() 
var intArray = Array<Int>()

벌써 확 줄어 들었다. 근데 놀라운건 더 줄일 수 있다!!!! 바로 아래와 같이!

var intArray = [Int]()

보통 우리는 Array를 표현할 때, [1,2,3,4,5]로 표현할텐데 이를 형상화 한거 같다!.

[ ] 사이에 Type을 명시해준다! 즉 [Int]!

Array 생성

Swift에서는 Array에 대해 여러 이니셜라이저를 제공한다. 차례대로 알아보자!

이니셜라이저란 초기 값을 생성하는 메소드 혹은 함수 정도로 생각하자!

빈 Array 생성

var intArray = [Int]()

그렇다 위에서 본 코드다!

기본 값을 가진 Array 생성

// repeating:반복하여 넣을 값 , count: 반복하여 삽입할 횟수
var intArray = [Int](repeating: 5, count: 3) // result : [ 5, 5, 5 ]

처음에 이 이니셜라이저를 보고 좀 헷갈렸다, repeating도 반복이고 count도 반복이잖아? 뭐야?

쉽게 생각하자 repeating은 값, count는 repeating의 값을 몇 개나 넣을 것인지..

리터럴 값으로 생성

var shppingList = ["Eggs", "Apple"]

처음부터 Array에 값을 넣어 주는 방법이다.

다른 Array들로 생성

var threeArray = [3, 3, 3]
var twoArray = [2, 2]
var oneArray = [1]

var mergeArray = oneArray + threeArray + twoArray
// -> [1, 3, 3, 3, 2, 2] 왼쪽부터 오른쪽 Array순으로 !

기존의 배열들을 합쳐서 생성하는 것도 가능하다. 이 때 mergeArray 값들의 순서는 당연하겠지만 왼쪽 Array부터 오른쪽 Array 순으로 값이 들어 간다.

주의할 점은 합칠 Array들의 Type이 모두 같아야 한다! Swift는 Type을 굉장히 엄격하게 관리하기 때문에 기본적으로 모든 연산들은 같은 Type에서 이뤄저야 한다!

let stringArray = ["문자열 배열"]
let intArray = [1]
let mergeArray = stringArray + intArray // 에러에러에러!!!

Array 수정

개발을 하다보면 처음부터 Array에 기본 값이 주어진 상황보다는 빈 Array로 시작해서 추가 하고 필요에 따라 삭제하는 상황이 더 많다.

append

Array의 맨 끝에 Element를 추가 한다!

var shppingList = ["Eggs", "Apple"]
shoppingList.append("Banana") // ["Eggs", "Apple", "Banana"]

insert

지정한 위치에 Element를 추가 한다!

shoppingList.insert("Grape", at:2) // ["Eggs", "Apple", "Grape", "Banana"]

연산자를 사용한 다른 Array 추가

+= 연산자를 사용하여 다른 Array의 값을 쉽게 추가할 수 있다. ( 물론 같은 Type의 Array이어야한다!)

// 맨 뒤에서 부터 데이터가 추가 된다.
shoppingList += ["배", "감"] // ["Eggs", "Apple", "Grape", "Banana", "배", "감"]

Array 삭제

let removedItem = shoppingList.remove(at: 2) // 2번째 인덱스의 Element 삭제 
// _ = shoppingList.remove(at: 2) 생략 가능
// 수행 후 shoppingList 항목
//["Eggs", "Apple", "Banana", "배", "감"] // Grape가 삭제

remove(at:) 메소드는 입력한 인덱스의 Element를 삭제하고 그 Element를 반환한다.

_ 키워드로 생략 가능하다.

처음과 마지막 Element를 삭제하는 메소드 또한 존재한다

_ = shoppingList.removeLast() // 마지막 Element 삭제
_= shoppingList.removeFirst() // 첫 Element 삭제

Array의 순회

Array 뿐만 아니라 Set, Dictionary와 같은 Swift의 모든 Collection Type에서는 편리한 순회를 제공한다.

for item in shoppingList {
    print(item)
}

// 위의 코드는 아래 코드와 같다

for i in 0 ... shoppingList.count {
    print(shoppingList[i])
}

짜잔. 가독성도 좋고 코드의 길이도 짧아졌다.

만약 값과 인덱스가 모두 필요한 경우라면 아래와 같은 기능도 지원한다

for (index, item) in shoppingList.enumerated() {
    print("index : \(index) item : \(item)")
}

바로 enumerated() 메소드를 사용하는 것.! 해당 메소드는 (index, value) 튜플을 반환하는데 이를 그대로 튜플로 받아 사용할 수 있다. 참 여러모로 편리하다!

.map, .filter 등과 같은 고차 함수 같은 더 많은 편리한 메소드들이 있다. 이러한 메소드들도 계속 추가하여 다뤄보도록 하겠다!

댓글남기기