728x90
반응형

컬렉션 타입에 대해서 공부하려고 한다.
컬렉션 타입에는 Array, Dictionary, Set 이라는 타입이 존재한다.
먼가 파이썬에서 쓰는 것과 많이 비슷해 보인다.

1. Array

순서가 있는 리스트 컬렉션

다음과 같이 선언한다.

//MARK: - Array
var integers: Array<Int> = Array<Int>()
var doubles: Array<Double> = Array<Double>()

// 그 외 다양한 표현들
var integers: Array<Int> = [Int]()
var integers: Array<Int> = []
var integers: [Int] = Array<Int>()
var integers: [Int] = [Int]()
var integers: [Int] = []
var integers = [Int]()

Array의 타입이 Int 뿐만 아니라 Double, String 등 기본 데이터 타입을 사용할 수 있다.
그리고 다양한 방법으로 선언해줄 수 있다.

Array 컬렉션에 데이터를 추가하려면 append() 를 사용해서 추가할 수 있다.
순서대로 데이터가 추가된다.
그리고 Int 타입에 Double 타입을 넣을 수 없듯이 데이터 타입과 맞지 않는 값을 입력할 수 없다.

integers.append(1)
integers.append(2)
integers.append(3)
integers.append(4)
integers.append(5)
print(integers)

==================== 출력 결과 ====================
[1, 2, 3, 4, 5]

추가한 순서대로 컬렉션에 추가되어있는 것을 확인할 수 있다.

그리고 컬렉션에 어떤 데이터를 포함하고 있는 지 여부를 확인하려면 contains() 를 사용해서 확인할 수 있다.
컬렉션에 데이터가 포함되어있다면 true, 포함되어 있지 않다면 false 가 출력된다.

// 포함하는지 여부 확인
integers.contains(1)
print(integers.contains(1))
integers.contains(10)
print(integers.contains(10))


=================== 출력 결과 ===================
true
false

위에서 1, 2, 3, 4, 5 를 컬렉션에 추가했다.
1은 포함되어있어 true, 10은 포함되어 있지 않기 때문에 false 를 출력한다.

그리고 Array 컬렉션에서 삭제하려면 다음과 같이 할 수 있다.
remove(at: ) 을 통해 해당 인덱스의 멤버의 값을 삭제
removeLast() 를 통해 마지막 멤버의 값을 삭제
removeAll() 을 통해 멤버 전부 삭제

// 해당 인덱스의 값을 삭제
integers.remove(at: 0)
print(integers)
// 마지막 멤버 삭제
integers.removeLast()
print(integers)
// 전부 삭제
integers.removeAll()
print(integers)

=================== 출력 결과 ===================
[2, 3, 4, 5]
[2, 3, 4]
[]

그리고 컬렉션에 들어있는 멤버의 수를 확인하고 싶다면 count 를 통해서 확인할 수 있다.

var integers: Array<Int> = Array<Int>()

integers.append(1)
integers.append(2)
integers.append(3)
integers.append(4)
integers.append(5)
print(integers)

// 컬렉션에 들어있는 멤버의 수 출력
integers.count
print(integers.count)

=================== 출력 결과 ===================
5

마지막으로 상수로 컬렉션을 선언하면 당연히 변경할 수 없다.
데이터를 추가할 수도 없고 삭제할 수도 없다.

// let 상수로 배열을 선언하게 되면 변경이 불가능하다.
let immutableArray = [1, 2, 3]

 

2. Dictionary

키와 값의 쌍으로 이루어진 컬렉션이다.
파이썬의 Dictionary와 비슷해보인다.
Key의 값과 짝을 이루는 Value의 값을 가지고 있다.
Array와 비슷하게 여러가지 리터럴 문법을 활용할 수 있다.
* 리터럴 ? 변수에 넣는 변하지 않는 데이터, 데이터 그 자체(메모리 내부 데이터).
리터럴에 대한 내용은 아래에 참고 사이트에 추가해두었다.

딕셔너리 선언하기.

var anyDictionary: Dictionary<String, Any> = [String:Any]()

// 위와 동일한 표현
var anyDictionary: Dictionary <String, Any> = Dictionary<String, Any>()
var anyDictionary: Dictionary <String, Any> = [:]
var anyDictionary: [String: Any] = Dictionary<String, Any>()
var anyDictionary: [String: Any] = [String: Any]()
var anyDictionary: [String: Any] = [:]
var anyDictionary = [String: Any]()

Array 컬렉션과 마찬가지로 다양한 표현으로 선언이 가능하다.

딕셔너리에 데이터를 추가할 때 Key의 값에 대항하는 Value의 값을 정해준다.

// 키에 해당하는 값을 할당한다.
anyDictionary["someKey"] = "value"
anyDictionary["anotherKey"] = 100

print(anyDictionary)

=================== 출력 결과 ===================
["someKey": "value", "anotherKey": 100]

그리고 키에 해당하는 값을 변경해줌으로써 데이터를 변경할 수 있다.

// 키에 해당하는 값을 변경한다.
anyDictionary["someKey"] = "dictionary"
print(anyDictionary)

=================== 출력 결과 ===================
["someKey": "dictionary", "anotherKey": 100]

그리고 데이터를 삭제하려면 remove()를 사용하는 방법도 있지만
키에 해당하는 값을 nil로 변경하는 방법도 있다.

// 키에 해당하는 값을 제거한다.
anyDictionary.removeValue(forKey: "anotherKey")
print(anyDictionary)

// 키의 값을 nil로 해줌으로써 제거가 가능하다.
anyDictionary["someKey"] = nil
print(anyDictionary)

=================== 출력 결과 ===================
["someKey": "dictionary"]
[:]

remove를 통해서 anotherKey의 값을 삭제하고 someKey의 값을 nil로 해줌으로써
Dictionary 컬렉션에 있는 데이터가 모두 지워진 것을 확인할 수 있다.

그리고 상수로 선언해주면 당연히 키에 해당하는 값을 변경할 수 없다.

// 변하지 않는 딕셔너리 생성
let emptyDictionary: [String: String] = [:]
let initalizedDictionary: [String: String] = ["name": "jaynam", "gender": "male"]

그럼 키를 변경할 수는 없는 걸까?
키를 변경하기 위해서는 찾아보니 현재 키의 할당 값을 지우고 나서 새로운 키로 다시 생성하는 것 같다.
직접적으로 키를 변경할 수 있도록 지원하지는 않는 것 같다.
다른 방법이 있는지 더 찾아봐야겠다.

3. Set

순서가 없고 멤버가 유일한 컬렉션
즉, 중복된 값이 없다.
Array, Dictionary 와 다르게 축약형이 없기 때문에 다양한 표현으로 선언할 수 없다.

Set 선언하기

var intergerSet: Set<Int> = Set<Int>()

Set에 데이터를 추가하려면 insert() 를 사용한다.
그리고 Set 에는 중복된 값을 넣어도 중복되지 않는다.

// insert() 를 통해서 입력 가능
// 순서는 무작위로 정해진다.
intergerSet.insert(1)
intergerSet.insert(2)
// 중복된 값이 없다.
intergerSet.insert(3)
intergerSet.insert(3)
intergerSet.insert(3)
intergerSet.insert(4)
intergerSet.insert(5)
print(intergerSet)

=================== 출력 결과 ===================
[4, 1, 2, 3, 5]

데이터를 넣어보면 3을 3번 중복해서 넣었지만 값이 중복되지 않았고 순서 없이 추가된 것을 확인할 수 있었다.

Array 와 동일하게 값이 포함되어있는지에 대한 여부를 contains() 로 확인할 수 있다.

// 포함 여부 확인
intergerSet.contains(1)
intergerSet.contains(10)

=================== 출력 결과 ===================
true
false

포함되어 있으면 true, 포함되어있지 않으면 false 가 출력된다.

그리고 멤버를 삭제하려면
remove() 를 사용해서 해당 인덱스의 값을 지울 수 있고
removeFirst() 로 첫 번째 값을 삭제할 수 있고
removeAll() 로 전부 삭제할 수 있다.

// remove: 멤버 삭제
intergerSet.remove(5)
print(intergerSet)
intergerSet.removeFirst()
print(intergerSet)
intergerSet.removeAll()
print(intergerSet)

=================== 출력 결과 ===================
[4, 1, 2, 3]
[1, 2, 3]
[]

그리고 컬렉션에 들어있는 멤버의 수를 확인하고 싶으면 count 를 통해 확인할 수 있다.

var intergerSet: Set<Int> = Set<Int>()

intergerSet.insert(1)
intergerSet.insert(2)
intergerSet.insert(3)

// 멤버 개수 확인
intergerSet.count
print(intergerSet.count)

=================== 출력 결과 ===================
3

그리고 Set은 멤버의 유일성이 보장되기 때문에
즉, 중복된 값이 없기 때문에 집합 연산에 유용하게 사용할 수 있다.

// Set은 합집합, 교집합, 차집합 등 집합 연산을 사용할 수 있다.
// 멤버의 유일성이 보장되기 때문에(즉, 중복이 없기 때문에)

let setA: Set<Int> = [1, 2, 3, 4, 5]
let setB: Set<Int> = [3, 4, 5, 6, 7]

// 합집합
let union: Set<Int> = setA.union(setB)
print(union)

=================== 출력 결과 ===================
[3, 4, 5, 6, 7, 1, 2]


// 합집합 오름차순 정렬하기
let sortedUnion: [Int] = union.sorted()
print(sortedUnion)

=================== 출력 결과 ===================
[1, 2, 3, 4, 5, 6, 7]


// 교집합
let intersection: Set<Int> = setA.intersection(setB)
print(intersection)

=================== 출력 결과 ===================
[4, 3, 5]


// 차집합
let subtracting: Set<Int> = setA.subtracting(setB)
print(subtracting)

=================== 출력 결과 ===================
[1, 2]

 

- 참고 사이트 - 

www.edwith.org/boostcamp_ios/lecture/11202

 

[LECTURE] 06. 컬렉션 타입(Array, Dictionary, Set) (💎생각해보기) : edwith

생각해보기 ▶다음과 같은 경우에는 각각 어떤 컬렉션 타입을, 상수/변수 선언 중 어떤 것을 사용하면 유용할지 생각해 봅시다.  영어 알파벳 소문자를 모아두는 컬렉션 책의 제목과 저... - 부��

www.edwith.org

mommoo.tistory.com/14

 

상수(constant) 와 리터럴(literal)이란?

 상수(constant)와 리터럴(literal)에 대해 들어본적이 있는가? 만약, 프로그래밍을 어느정도 해왔던 사람이면 한번쯤은 들어봤을만한 용어 들 이다. 하지만 두 용어를 같은 의미로 사용하는 사람들�

mommoo.tistory.com

 

728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] 7. 함수 고급  (0) 2020.09.15
[Swift] 6. 함수 기본 (func)  (0) 2020.09.08
[Swift] 4. Any, AnyObject, nil  (0) 2020.09.07
[Swift] 3. 기본 데이터 타입  (0) 2020.09.07
[Swift] 2. 상수와 변수  (0) 2020.08.31
복사했습니다!