본문 바로가기

Programming/Swift for Beginners

[Swift] 016 Working with Collection (컬렉션 사용하기) for beginners


컬렉션은 개별적인 값만 표현할 수 있는 Int, Double, Float, Boolean, String 등의 자료형과 달리, 관련 있는 자료끼리 묶음으로서 일종의 집합적 성격을 갖게 하는 자료구조입니다. Swift는 배열(Array)과 딕셔너리(Dictionary)로 알려진 두 가지 타입을 제공합니다. 배열은 동일한 타입을 가진 값을 순서대로 저장하고, 딕셔너리는 동일한 타입을 가진 값을 순서와 상관없이 저장합니다. 따라서 딕셔너리는 유일한 식별자인 키(key)를 통해 값을 찾고 참조하게 됩니다.

이후 부터는 다양한 방법으로 정보 및 데이터를 그룹으로 분류할 수 있게 해주는 중요한 구조체인 컬렉션에 대부분 초점을 맞출 것입니다.


The Candyjar (사탕 항아리)

슈퍼마켓 선반 위에 놓인 비어 있는 사탕 항아리를 상상하면서 Swift 컬렉션의 개념을 살펴보겠습니다. 비어 있는 사탕 항아리에 넣을 수 있는 여러 종류의 사탕을 생각해보세요. 이 항아리를 여러 개의 사탕이나 값을 넣을 수 있는 컨테이너라고 부르겠습니다. Swift 언어로 사탕 항아리와 그 속의 내용물을 나타내는 여러 방법 중 배열(array)부터 시작해 보겠습니다. 배열은 같은 타입을 가진 여러 개의 값을 순서대로 저장합니다. 한 배열 안에서는 같은 값이 여러 다른 위치에서 나타날 수 있습니다. 따라서, 배열은 상당히 긴 값의 순서 리스트라고 생각하면 됩니다.

배열은 컴퓨터 언어에서는 기본적인 구조체이고 Swift에서 배열을 선언하기는 쉬운 일입니다.

아래 예제는 가상의 사탕 항아리에 넣을 사탕 값 세 개의 배열입니다.

let 키워드를 기억하시나요? let 키워드는 상수를 선언하는 키워드입니다. 위 예제에서는 jar 를 선언하고 열고 닫을 수 있는 특별한 기호인 [] 괄호를 사용했습니다. 배열에 있는 항목은 [] 로 묶습니다. 그러면 Swift는 배열이 선언되었다는 표시로 이해합니다.

배열 내의 각 값은 쉼표로 구분되어 하나의 값의 끝이 어디이고 또 다른 값의 시작이 어디인지 보여줍니다. Swift는 이 항목이 문자열로 표시된 것만 보고도 타입을 추론할 수 있습니다. 각각의 값이 큰따옴표로 묶여 있기 때문에 추론할 수 있는 것입니다.

배열이 세 개의 값을 가지고 있으며, 세 개의 값은 숫자 0부터 시작하고 순서대로 나열되어 있습니다. 실제로 Swift의 모든 배열은 '0번째 값' 부터 시작해 순서대로 번호가 매겨집니다. 이 번호는 배열 인덱스(array index)라고 부르며 배열 인덱스는 나타내는 값을 직접 보여줍니다.

이제 특정 값에 대한 배열의 정보를 얻는 방법을 알아보겠습니다. 배열의 두 번째 항목을 보겠다는 상황을 가정해 보겠습니다. 배열이 0부터 순서대로 시작하기 때문에 두 번째 항목은 인덱스 1이 됩니다.

Swift가 배열의 두 번째 항목으로 "Gooey Bears"의 값을 보여주고 해당 항목의 타입이 문자열이라고 알려줍니다. 

예상했던 대로 [1]을 다른 배열 인덱스로 대체할 때 그 위치의 값을 참조했습니다.

이 표기법은 매우 유용합니다. 괄호로 묶인 인덱스 번호를 사용해 배열의 개별 항목에 액세스할 수 있으니 유용하다고 할 수 있습니다. 

존재하지 않는 위치를 참조하게 되면 어떤 결과가 나타날까요? 현재 이용 가능한 인덱스 값의 범위 밖에 있는 인덱스를 사용해 보겠습니다.

존재하지 않은 항목을 요청함으로써 Swift를 괴롭혔으니 아래와 같은 에러 메시지가 뜨게 됩니다. Swift는 민감한 언어인 만큼 치명적인 에러가 났음을 알리고 규칙 위반이 원인이라고 알려줍니다. 

여기에서 Swift가 다른 컴퓨터 언어보다 나은 점을 발견할 수 있습니다. 바로 안전함(safety)입니다. Swift는 존재하지 않는 배열 번호를 참조하는 등의 예외적이고 변칙적인 행동은 용납하지 않는 안전한 환경을 가지고 있습니다. C 언어의 배열을 사용해 본 적이 있다면 존재하지 않는 배열에 액세스하는 것이 가능하다는 것을 알고 있을 것입니다. 실제로 과거에 불법 소프트웨어 트로이 목마를 만든 개발자가 이와 유사한 방법을 사용해 컴퓨터 시스템을 위태롭게 만든 적이 있습니다.

이 에러를 보고 "배열에 더 많은 값을 추가하고 싶으면 어떻게 해야 할까?" 라는 질문을 할 수 있습니다. 이 질문에 대한 답을 Swift는 가지고 있는데, 배열에 사용할 수 있는 append()라는 특별한 메서드를 가지고 있습니다. 배열에 값을 추가하려면 그냥 추가하면 됩니다. 가장 좋아하는 사탕을 항아리에 추가해 보겠습니다.

또 다른 에러가 발생했네요. 

Swift는 문자열 값의 배열이 불변하며 상수 배열의 내용을 변경하려 했다고 설명하고 있습니다. let 키워드를 사용해 배열을 상수 배열로 선언했었기 때문입니다. 상수의 값은 변경할 수 없고 상수로 선언된 배열도 마찬가지로 변경할 수 없습니다.

변경 가능한 두 번째 배열을 생성해야 합니다. 불변 배열의 내용으로 시작하면서 동시에 두 번째 배열을 만들 수 있습니다.

아래 예제에서는 변수 refillableCandyJar를 선언했고 jar 상수 배열의 내용으로 초기화 했습니다. 상수 배열에 존재하는 동일한 값은 모두 이 변수 배열의 일부가 되었습니다.