-
[레인스톤 iOS] 스위프트 easy하게 배워볼까? - 콜렉션 타입(1)Swift 기초문법 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 외에도 first나 last를 통해 배열의 첫번째 또는 마지막 값에 접근할 수 있는 기능도 지원합니다.
여기서 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를 활용해서 배열에 접근한 것처럼 removeFirst나 removeLast를 통해
배열의 첫번째 또는 마지막 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부터 시작하기 때문입니다:)
끗!
오늘은 여기까지 입니다.
다음은 셋과 사전으로 찾아오겠습니다:)
안녕~
반응형'Swift 기초문법' 카테고리의 다른 글
[레인스톤 iOS] 스위프트 easy하게 배워볼까? - 제어문(1) (0) 2022.02.18 [레인스톤 iOS] 스위프트 easy하게 배워볼까? - 콜렉션 타입(2) (0) 2022.02.15 [레인스톤 iOS] 스위프트 easy하게 배워볼까? - 문자열과 문자(3) (0) 2022.02.10 [레인스톤 iOS] 스위프트 easy하게 배워볼까? - 문자열과 문자(2) (0) 2022.02.03 [레인스톤 iOS] 스위프트 easy하게 배워볼까? - 문자열과 문자(1) (3) 2022.01.29