다수의 값을 함께 관리하는 것이 '배열'과 '사전(Dictionary) "이다. 이에 대해 기본 작업에 대해 설명한다.


배열의 기본 사항

여러 값을 한꺼번에 관리하는 데 사용되는 것이 '배열'이다. 배열은 동일한 유형의 값을 다수 정리하여 보관한다. 배열에는 여러 값을 저장할 수 있는 장소가 준비되어 있어, 이를 0부터 시작되는 일련 번호(인덱스 번호)가 붙여진다. 이를 이용하여 특정 번호의 값을 얻거나, 다른 값을 저장하거나 하는 것이 가능하다.

배열은 최초에 "몇 개의 값을 저장할지"를 지정해서 생성한다. 예를 들어 "10개 저장할 수 있는 배열"을 만들면, 인덱스 번호 0~9의 저장고(1~10가 아니다는 것을 주의하자!)에 값을 저장할 수 있다. 저장고가 확보되지 않은 번호를 지정하여 값을 읽거나 쓰려고 하면 오류가 발생한다.

그럼 배열의 기본적인 사용법을 간단하게 정리해 보겠다.

배열 만들기

var 변수:유형 = [유형] ()
var 변수:유형 = [유형](count : 수, repeatedValue : 값)
var 변수:유형 = [값 1, 값 2, ...]

값 읽고 쓰기

변수 = 배열[번호]
배열[번호] = 값

배열은 유형으로 유형명의 앞뒤를 [] 기호로 묶는다. 예를 들어 String의 값을 저장하는 배열이라면, [String]과 같이 유형을 지정한다.

배열의 생성은 유형 이렇게 해서 만들 수 있다. 그러나 이것으로 만들어지는 것은 빈공간의 배열이므로 일반적으로 제공하는 보관 저장소의 수와 초기 값의 값을 지정하여

[유형] (count : 준비하는 보관 장소의 수, repeatedValue : 초기 값)

이런 상태로 지정해 작성한다. 또는, [값1, 값2, ...]과 같이 배열을 리터럴로 작성하여 만들 수 있다. 예를 들어, 다음의 2개는 같은 배열이 된다.

var arr1 : [Int] = [Int] (count : 10, repeatedValue : 0)
var arr2 : [Int] = [0,0,0,0,0,0,0,0,0,0]

이 정도의 요소 수인 경우에는 리터럴으로 작성하는 것이 편리할 것이다. 그러나 예를 들어 "저장할 수 있는 요소의 수가 1만개"라고 경우에는 [0,0,0 ......]와 같이 하는 것이 불가능하기 때문에, (count : 10000, repeatedValue : 0)로 작성하는 것이 간단하다.

또한 Swift의 특징으로, 대입하는 값에서 유형이 명확하게 알 수 있다면 변수 선언에 있는 유형은 생략할 수 있어서, 위의 문장은 다음과 같이 작성해도 된다.

var arr1 = [Int] (count : 10, repeatedValue : 0)
var arr2 = [0,0,0,0,0,0,0,0,0,0]



배열과 for-in 구문

배열은 인덱스 번호를 지정하여 하나씩 꺼내 처리할 수 있지만, 데이터 관리 등에 이용하는 경우에는 모든 요소를 동일하게 처리하는 작업이 필요하다.

이러한 경우에 사용되는 것이 for-in 구문인데, 아래와 같은 방식이다.

for 변수 in 배열 {
    ...... 수행할 처리 ......
}

for-in는 배열에서 순서대로 값을 꺼내 변수에 할당하고, 그 후에 {} 부분을 실행하는 것을 반복하고 있다. 이 {} 안에 변수를 사용하는 형태로 작업을 준비하면 배열의 모든 요소에 대해 동일한 작업을 할 수 있다.

아래에 간단한 예제를 보도록 하자.

let data:[Int] = [10, 20, 30]
var total:Int = 0
for num in data {
    total += num
}
println("total: \(total)")

배열 data의 값을 모두 꺼내서 합계하여 표시하는 것이다. for num in data라고 해서 data부터 순서대로 값을 num으로 꺼내 처리하고 있는 것을 알 수 있다.




배열 요소 작업

배열은 만들 때 요소 수를 지정하면 나중에 보관할 수 있는 저장고를 늘리거나 줄일 수 없다. ......라고 하는 것은 옛날 이야기이다. Swift는 나중에 배열의 요소를 변경할 수 있다. 그것은 배열 메소드을 이용한다.

메소드? 그렇다 배열도 사실 오브젝트이다. 그래서 그 안에 포함되어 있는 속성과 메소드를 호출해 처리할 수 있다. 추가로, 연산자 덧셈하기 가능하다.

배열끼리 1개로 정리

변수 = 배열 + 배열

배열의 끝에 값을 추가

배열.append(값)

지정된 위치에 값을 삽입

배열.insert(값, atIndex : 삽입 위치)

마지막 항목을 삭제

배열.removeLast()

지정된 인덱스 번호의 값을 삭제

배열.removeAtIndex(번호)

지정한 범위의 값을 제거

배열.removeRange(레인지)

모든 삭제

배열.removeAll()

현재의 요소 수 얻기

변수:Int = 배열.count

첫 번째 요소 · 마지막 요소 얻기

변수 = 배열.first
변수 = 배열.last

지정 위치에 값을 삽입하는 insert는 atIndex에 삽입 위치를 나타내는 정수를 지정한다. 첫번째 앞(인덱스 0의 요소 앞)이 0, 인덱스 0과 1사이가 1, ......라는 식으로 지정된다.

또한 지정 범위의 값을 삭제하는 removeRange와 제거하는 요소의 인덱스 번호를 사용하여 범위를 제공한다. 예를 들면, removeRange(3 ... 5)이라면, 인덱스 번호 3~5의 요소를 제거한다.

우선, 여기 메소드와 속성이 대충 사용할 수 있게 되면, 배열도 자유 자재로 다룰 수 있게 될 것이다.



사전(Dictionary)

배열은 단순히 값을 순서대로 정렬하여 관리하는 것만으로, 저장된 값을 인덱스 숫자로 이용해서 꺼냈다. 때로는, 이 숫자보다는 이름으로 관리하는 편이 좋은 경우도 있다.

그런 경우에 사용되는 것이 "사전 (Dictionary)"이다. 사전은 "키"라는 값을 사용하여 관리한다. 각각의 값은 인덱스 번호 대신에 키가 붙여져 있고, 키를 사용하여 값을 제거하거나 변경하는 것이다.

사전 만들기

var 변수 : [유형 : 유형] = [유형 : 유형]()
var 변수 : [유형 : 유형] = [키1 : 값1, 키2 : 값2, ...]

값에 액세스

변수 = 사전 [키]
사전 다음 키 = 값

for-in 의한 반복

for (변수1, 변수2) in 사전 {
    ...... 반복 처리 ......
}

사전은 []로 두 가지 데이터 유형을 지정한다. 이는 키와 값의 유형을 지정한다. 예를 들어, String의 키에 Int 형의 값을 보관한다면, [String : Int]와 같이 지정한다. 그대로, [String : Int]()를 변수에 할당하면 값이 아무것도 없는 공백의 사전이 만들어 진다.

사전는 배열과 달리, 최초에 정해진 수의 저장 공간를 준비할 필요는 없다. 키를 사용하여 값을 저장하 면, 그 키가 사전에 추가된다(기존에 같은 키가 있으면, 그 값이 변경된다).

for-in는, 배열과 사용 방법이 조금 다르다. for 후에 (변수1, 변수2)와 같이 튜플 변수를 제공한다. 이렇게하면 사전에서 검색한 요소의 키와 값을 각각의 변수에 할당한다.

아래에 실제 사용 예제를 보도록 하자.

let data:[String:Int] = ["국어":98,"수학":76,"영어":54]
var total = 0
for (key, val) in data {
    total += val
    println("add \(key)")
}
println("Total: \(total)")

3과목의 점수를 사전에 모와서, 그것로 부터 요소를 꺼내서 합계를 계산한다. 실행하면 값을 꺼낼 때마다 "add 〇〇"과 키가 출력되고, 마지막으로 총 합계가 표시된다.


사전을 활용하는 방법

사전도 배열과 같은 개체이므로 속성과 메소드를 가지고 있다. 이 메소드들은 호출하여 사전의 내용을 조작할 수 있다. 그러나 배열과 달리 사전은 키를 지정하여 간단히 새로운 값을 추가할 수 있으므로 값의 삽입하는 메소드는 없다.

지정된 키 값을 삭제

사전.removeValueForKey(키)

모든 값을 삭제

사전.removeAll()

키 값을 모두 얻기

변수 = 사전.keys

보관되어 있는 값을 모두 얻기

변수 = 사전.values

요소 수를 얻기

변수 : Int = 사전.count

이들 중 좀 유심히 봐야 하는 것은 "keys"와"values"이다. 이 두개는 키와 값을 함께 저장하는 속성이다. 이 두개의 반환 값은 LazyBidirectionalCollection라는 생소한 컬렉션 클래스의 인스턴스인데, 이것은 그대로 for-in에서 차례로 값을 얻을 수 있다.

아래에 사전과 관련되 샘플을 보도록 하겠다.

var data:[String:Int] = ["국어":98,"수학":76,"영어":54]
let keys = data.keys
let vals = data.values
for key in keys {
    println(key)
}
for val in vals {
    println(val)
}

사전에서 keys와 values에서 각 값을 얻어서, 그 값들 for-in으로 출력한다. 이로 보관된 키와 값이 표시되는 것을 확인할 수 있다.

'Swift' 카테고리의 다른 글

[Swift] 함수 리터럴 및 클로저  (0) 2017.12.10
[Switf] 구조체, 열거형, 튜플  (0) 2017.12.09
[Swift] 배열과 사전  (0) 2017.12.09
[Swift] 클래스 기본  (0) 2017.12.09
[Swift] 함수  (0) 2017.12.09
[Swift] 제어 구문  (0) 2017.12.09

+ Recent posts