ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [레인스톤 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 외에도 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부터 시작하기 때문입니다:)

     

    끗!

    오늘은 여기까지 입니다.

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

    안녕~

     

    반응형

    댓글

Designed by Tistory.