Swift 기초문법

[레인스톤 iOS] 스위프트 easy하게 배워볼까? - 콜렉션 타입(1)

레인스톤 2022. 2. 12. 15:36
반응형

안녕하세요!

iOS개발자로 일하고있는 레인스톤입니다:)

 

오늘은 콜렉션 타입에 대해서 알아보겠습니다.

스위프트의 콜렉션 타입은 배열, 셋, 그리고 사전입니다.

 

콜렉션 타입

위에서 언급한 것처럼 스위프트에서 콜렉션 타입은 배열(Array), 셋(Set), 그리고 사전(Dictionary)을 지원합니다.

이 콜렉션 타입은 변수에 할당하면 변경이 가능하고 상수에 할당하면 변경이 불가능합니다:)

너무 당연한 개념이겠죠?

 

let array: [String] = []
array.append("다크서클")
// Cannot use mutating member on immutable value: 'array' is a 'let' constant

 

그래도 굳이 예제를 살펴보면 이렇게 에러 메시지를 뱉어냅니다.

자 ~ 그럼 이제 배열부터 시작해보겠습니다.

 

배열

배열 문법의 축약형

 

배열 타입은 Array<Element>로 표현할 수 있는데, 이를 간단하게 [Element] 형태로 표기할 수도 있습니다.

 

var array1: Array<String> = []
print(type(of: array1)) // Array<String>

var array2: [String] = []
print(type(of: array2)) // Array<String>

 

array1과 array2 모두 배열을 나타내는 문법입니다.

위, 아래 어떤 방법으로 사용해도 같은 타입이며 문제가 없습니다.

 

빈 배열 생성하기

 

그리고 빈 배열은 위와 같은 방식 외에도 생성할 수 있는 방법이 있습니다.

 

var array1 = [Int]()
var array2: [Int] = []
print(array1) // []
print(array2) // []
print(type(of: array1)) // Array<Int>
print(type(of: array2)) // Array<Int>

 

여기서 array1과 array2도 같은 Int형 빈 배열입니다.

 

array1.append(3)
print(array1) // [3]

array1 = []
print(type(of: array1)) // Array<Int>

 

이렇게 3(Int)을 넣어줄 수도 있고, 배열을 비운 후에도 Int형 배열로 타입이 유지됩니다.

 

기본 값을 가진 배열 생성하기

 

기본 값을 가진 배열은 어떻게 생성할 수 있을까요?

 

var array = [3]

print(array) // [3]
print(type(of: array)) // Array<Int>

 

어렵지 않습니다.

그냥 기본 값을 넣어주면 되겠죠?

이 때 배열의 Element 타입은 스위프트가 추론해서 적용해줍니다.

그런데 여러개의 반복되는 값을 가진 배열은 어떻게 생성할 수 있을까요?

예를들면 0을 10개, 100개, 1000개 가진 배열은 어떻게 생성할 수 있을까요?

 

var array = Array(repeating: 0, count: 10)

print(array) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
print(type(of: array)) // Array<Int>

 

repeating과 count를 이용하면 쉽게 생성할 수 있습니다.

var array = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 이런 방식으로 만들어 줄 수도 있습니다만!?

100개, 1000개가 됐을 때는 불가능하진 않지만 다소 어렵겠죠?

이럴 때 repeating에 반복될 Element를 넣어주고 count에 반복될 수를 넣어주면 자동으로 생성해줍니다:)

 

배열 더하기

 

같은 타입의 배열은 + 연산자를 활용하여 더해줄 수 있습니다.

 

var today = ["오늘은"]
var saturday = ["토요일"]

var array = [3, 3, 3]
var anotherArray = [6, 6, 6]

print(today + saturday) // ["오늘은", "토요일"]
print(array + anotherArray) // [3, 3, 3, 6, 6, 6]
print(today + array) // Binary operator '+' cannot be applied to operands of type '[String]' and '[Int]'

 

문자열이나 정수가 아닌 배열도 더할 수 있다는 점 잊지 말아주세요.

물론 마지막 코드와 같이 서로 다른 타입의 Element를 가진 배열을 더해주면 에러가 발생합니다.

 

배열에 접근하기

 

배열에 있는 Element에는 어떻게 접근할 수 있을까요?

 

var array = ["김철수", "김영희", "도미노 피자", "먹고싶다", "의식의 흐름"]

print(array[0]) // "김철수"
print(array[1]) // "김영희"
print(array.first!) // "김철수"
print(array.last!) // "의식의 흐름"

 

이렇게 배열의 Index를 통해 접근할 수 있습니다.

주의할 점은 첫 번째 Element는 1이 아니라 0이라는 점입니다.

배열의 Index는 0부터 시작한다는 점 잊지말아주세요:)

 

또한 스위프트에서는 Index 외에도 firstlast를 통해 배열의 첫번째 또는 마지막 값에 접근할 수 있는 기능도 지원합니다.

여기서 first나 last 뒤에는 왜 !(느낌표)가 붙어있는지는 옵셔널 파트에서 설명해드리겠습니다!

궁금하신 분들은 swift optional 이란 키워드로 구글링 해보셔도 됩니당 ㅎㅎ

 

var array = ["김철수", "김영희", "도미노 피자", "먹고싶다", "의식의 흐름"]

print(array[5]) // Thread 1: Fatal error: Index out of range

 

또 하나 주의해야할 점은 존재하지 않는 Index에 접근하면 out of range 에러를 발생시키니까 주의해주세요!

코테 볼 때 실수하시면 한 문제 틀리게 되고 ㅠㅠ 앱 만들 때는 앱이 죽게 됩니다 ㄷㄷ

 

배열 확인하기

 

배열에 몇 개의 Element가 있는지 확인할 수 있는 방법도 있습니다.

 

var array = ["김철수", "김영희", "도미노 피자", "먹고싶다", "의식의 흐름"]

print(array.count) // 5

 

count를 통해서 배열 안에 몇 개의 Element가 있는지 확인할 수 있습니다.

개수 외에도 배열이 비어있는지 아닌지 확인할 수 있는 방법도 있습니다.

 

if array.isEmpty {
    print("비었다.")
} else {
    print("비어있지 않다.") // 비어있지 않다.
}

 

isEmpty가 if 문을 통해 확인된다는 것은 Bool타입을 반환한다는 의미겠죠?

배열이 비어있으면 true 그렇지 않으면 false를 반환해줍니다.

 

배열 변환하기

 

배열은 Element 추가, 변경, 삭제를 모두 지원합니다.

물론 이 경우에 배열을 변수(var)로 선언해주셔야합니다.

 

var array: [String] = []

array.append("토요일 공부하기")
print(array) // ["토요일 공부하기"]

array += ["일요일도 공부하기", "월요일은 출근하기"]
print(array) // ["토요일 공부하기", "일요일도 공부하기", "월요일은 출근하기"]

 

Element를 추가해줄 때는 append를 통해 추가해줄 수도 있고

+= 연산자를 활용하여 같은 타입의 배열 자체를 더해줄 수도 있습니다.

 

var array = ["토요일 공부하기", "일요일도 공부하기", "월요일은 출근하기", "코드리뷰", "QA"]

array.remove(at: 2)
print(array) // ["토요일 공부하기", "일요일도 공부하기", "코드리뷰", "QA"]

array.removeFirst()
print(array) // ["일요일도 공부하기", "코드리뷰", "QA"]

array.removeLast() // ["일요일도 공부하기", "코드리뷰"]
print(array)

array.removeAll()
print(array) // []
print(array.isEmpty) // true

 

Element를 삭제해줄 때는 remove(at: )를 활용해주면 됩니다.

삭제하고 싶은 Element의 Index를 입력하면 해당 Element가 배열에서 삭제됩니다.

월요일은 출근하기를 삭제해버렸네요:)

 

또는 first나 last를 활용해서 배열에 접근한 것처럼 removeFirstremoveLast를 통해

배열의 첫번째 또는 마지막 Element를 삭제해줄 수도 있습니다.

 

모든 Element를 삭제하고 싶을 때는 removeAll을 통해 빈 배열로 만들어 줄 수도 있습니다!

공부도 출근도 가라 ~

 

배열의 순회

 

for-loop를 활용하여 배열의 Element를 순회할 수도 있습니다.

 

var todoList = ["스위프트 공부", "주식 공부", "부동산 공부", "iOS 공부", "공부 그만"]

for todo in todoList {
    print(todo)
}

/*
 스위프트 공부
 주식 공부
 부동산 공부
 iOS 공부
 공부 그만
 */

 

만약 배열의 Element뿐만 아니라 Index까지 함께 필요할 땐 어떻게 해야될까요?

 

for (idx, todo) in todoList.enumerated() {
    print("할일 \(idx+1) : \(todo)")
}

/*
 할일 1 : 스위프트 공부
 할일 2 : 주식 공부
 할일 3 : 부동산 공부
 할일 4 : iOS 공부
 할일 5 : 공부 그만
 */

 

enumerated를 통해 순회하면 Index와 Element 모두에 접근할 수 있습니다.

Index에 +1을 해준 이유는 아시죠?

배열의 Index는 0부터 시작하기 때문입니다:)

 

끗!

오늘은 여기까지 입니다.

다음은 셋과 사전으로 찾아오겠습니다:)

안녕~

 

반응형