Swift

[Swift]집단 자료형 - 배열(Array)

느려도천천히 2021. 12. 20. 21:53

서로 관련있는 데이터끼리 모아서 관리할 수 있도록 집단 자료형이는 것을 제공합니다
1)배열(Array)
2)집합(Set)
3)튜플(Tuple)
4)딕셔너리(Dictionary)
4개 모두 어떤 타입의 데이터라도 모두 저장할 수 있지만, 튜플을 제외한 나머지는 저장되는 모든 데이터의 타입의 동일해야 됩니다

배열(Array)

일련의 순서를 가지는 리스트 형식의 값을 저장하는데 사용되는 자료형
배열에 입력되는 개별 아이템들은 각각의 순서가 있는데 순서에 일련번호를 인덱스(Index)라고 합니다
인덱스(Index)는 0부터 시작해서 아이템이 추가될때 마다 1씩 증가하는 특징이 있다
배열에 추가를 하면 인덱스는 1씩 증가 하며, 만약 3번째를 지운다면 4번째가 3번째로 들어오며 차례대로 인덱스가 앞당겨집니다

특징

1)배열에 저장할 아이템의 타입에는 제약이 없지만, 하나의 배열에 저장하는 아이템은 모두 같은 타입이여야 합니다
2)선언 시, 배열에 저장할 아이템의 타입을 명확하게 정의해야 합니다
3)배열의 크기는 동적으로 확장할 수 있다

var cities = ["Seoul", "NewYork", "Paris", "LA"]
//선언과 동시에 값 할당
//cities는 문자열 배열
cities[0] // "Seoul"
cities[1] // "NewYork"
...

cities[index]는 항상 0부터 시작하는것을 기억하자
헷갈리는 것! 인덱스가 항상 0부터 시작하니 cities는 4개 => 0,1,2,3 이렇게 총4개로 구성 0부터인것을 꼭 기억하자

배열 순회 탐색

순서가 있는 데이터를 처음부터 마지막까지 차례대로 읽어 들이는 것을 순회 탐색 이라고 합니다
순회 탐색에서는 반복문이 주로 사용되는데, 간단하게 for ~ in구문으로 사용해볼 수 있습니다

var cities = ["Seoul", "NewYork", "Paris", "LA"]
cities.count // .count는 배열의 길이를 구할 때 사용, 결과: 4

count와 같은 것들을 속성(properties)라고 부릅니다
count를 통해 for ~ in 구문을 사용해보자

var cities = ["Seoul", "NewYork", "Paris", "LA"]

for i in 0..<cities.count {// 0 ~ 3까지
    print(cities[i])
}

결과 : "Seoul" "NewYork" "Paris" "LA"

cities.count는 4이고 i는 0부터 차례대로 들어가서 cities[0]을 출력하고 다시 for으로 올라가 i+1 -> i = 1이 되어 다시 print문을 출력.. 이걸 반복하여 총3까지 순서대로 출력이 되고 끝나게됩니다

하지만 더욱 간단한 방법이 있다
배열의 순회 특성, 즉 이터레이터(Iterator)를 이용하는 것이다

var cities = ["Seoul", "NewYork", "Paris", "LA"]

for i in 0..<cities {// 0 ~ 3까지
    print(i)
}

결과 : "Seoul" "NewYork" "Paris" "LA"

위에 .count와 이터레이터를 사용한 것에 차이가 보이시나요?
이터레이터를 사용하여 cities 아이템이 차례대로 출력이 되고 있습니다
이때, i는 문자열 타입입니다(.count를 사용할 때, i는 Int타입입니다)

하지만이터레이터를 사용하면, 배열아이템의 인덱스를 알기는 어렵습니다
이때는 index(of:)를 사용하여 인덱스를 알수 있습니다 바로 알아 보죠!

var cities = ["Seoul", "NewYork", "Paris", "LA"]

for i in 0..<cities {// 0 ~ 3까지
    let index = cities.index(of: i) // cities에 "seoul"이 몇번째 인덱스인가~?
       print("\(index): \(cities)"
}

결과 : "0: Seoul" "1: NewYork" "2: Paris" "3:LA"

위와 같이 cities.index(of: i)는 cities안에 i라는 문자열의 인덱스 값을 알려줄 수 있습니다
그리하여 print("(index): (cities)")에 결과가 나타납니다
한마디로 index(of:)는 값을 넣으면 해당 배열안에 몇번째 인덱스에 저장되어 있는지 알려주는 역할을 합니다

배열의 동적 선언과 초기화

위와 같이 배열을 생성과 동시에 할당해주는 형식이 아니라 동적으로 데이터에 따라 크기가 정해지는 것을 알아보자
값을 할당 하지 않는 빈 배열을 선언하고 초기화할 때는 두 가지 형식을 사용할 수 있다

Array<type> ()
//문자열 배열의 선언과 초기화
var cities = Array<String>()

위와 같이 < >기호를 사용하여 배열 내부에서 사용할 타입을 지정하는 문법을 제너릭(Generic)이라고 한다. --> 나중에 자세하게 알아보자
cities는 문자열배열이며 빈 배열입니다

//문자열 배열 선언
var cities: Array<String>

이렇게 선언된 배열은 초기화되지 않았으므로 아직 메모리 공간을 할당받지 않은 상태입니다
따라서 cities배열은 아무것도 아직 저장할 수 없는 상태입니다
그럼 초기화를 해주죠

cities = Array()

초기화가 끝났습니다...ㅎ
배열을 정의하는 구조체인 Array에 소괄호 ( )만 붙여주면 끝입니다
여기서 Array()이 아닌 Array()로 해주는 이유는 이미 String으로 배열을 선언했기 떄문에 단지 선언된 배열을 초기화하는 구문이기 떄문에 타입을 다시 쓸 필요가 없습니다(Array()으로 해도 문제는 없습니다)

[타입]() // 제너릭 < >을 뺴고 사용 가능
//배열선언과 초기화
var cities = [String]()
//배열선언
var cities : [String]()
//초기화
cities = [String]()
cities = []

초기화에 2가지 방법이 있습니다
맨처음 알려드린거 처럼 타입을 제거하고 적어도 되고 []만 사용해도 무방합니다

배열 아이템 동적 추가

배열의 아이템 동적으로 할당 방법은 대표적으로 3가지가 있습니다
1)Append(_:)

cities.append("Incheon")
print(cities[4]) 
//Incheon

Append(_:)는 배열의 마지막에 값을 추가한다라는 의미입니다.

2)Insert(at:)

cities.insert("busan", at:0)
print(cities[0])
//결과: busan

insert(_:, at:)은 _는 추가할 아이템, at:은 인덱스 값을 넣으면 해당 인덱스에 아이템을 추가한다 라는 의미 입니다

3)append(contentOf:)

cities.append(contentOf: ["sydeny","tokyo"])
print(cities)
//....."sydeny" "tokyo"

append(contentOf:)는 append와 마찬가지로 배열 맨뒤에 여러개의 아이템을 추가할 때, 사용합니다