[Swift 기초] 컬렉션 타입

2022. 3. 6. 19:27Swift 기초 정리

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

 

  • 컬렉션 타입: 여러 값들을 모아서 저장하는 데이터 타입

 

 

Array, Dictionary, Set

 

1. Array: 순서(index)가 있는 리스트 형태의 컬랙션

//Array 선언 및 생성 빈 Int Array 생성
var SomeArray: Array<Int> = Array<Int>()

var arr1: Array<Int> = []
var arr2: [Int] = Array<Int>()
var arr3: [Int] = Int
var arr4: [Int] = []
var arr5 = Int()
//array는 여러 리터럴 문법을 활용할 수 있어 표현 방법이 다양하다.
  • 배열에는 같은 타입의 값들이 차례대로 저장되며, 이 값들은 저장된 위치를 나타내는 인덱스로 참조된다.
    • 배열은 한 가지 타입의 요소만을 가지므로 암시적 또는 명시적으로 선언될 수 있다.
      var arr_string = ["hi","this","is","string"] //암시적
    • 명시적 선언을 하기 위한 콜론 사용법은 타입 이름 앞뒤로 대괄호를 둘러싼다.
      var arr_int:[Int] = [1, 2, 3, 4] //명시적
  • 배열 요소의 값을 정의하기 위해 대괄호([])를 사용
  • 서로 다른 자료형을 가진 배열을 만들 수 있다: 다른 자료형의 배열을 Any형 배열에 할당할 수 있다.
    var anyarr: [Any] = ["dkss", 1, 3, "dd", 4.4]
  • let 키워드로 선언된 배열은 불변(immutable) 배열이라고 하고, 요소의 값이나 크기를 변경할 수 없다.
  • var 키워드로 선언된 배열은 변경이 가능하며, 이를 가변(mutable) 배열이라고 한다.

1-1. 배열의 생성과 초기화

var threeDoubles = [Double](repeating: 0.0, count: 3)
//[0.0, 0.0, 0.0]
var fourInts = [Int](repeating: 1, count: 4)
//[1, 1, 1, 1]
var plusArr = fourInts + fourInts
//[1, 1, 1, 1, 1, 1, 1, 1]

//다른 타입의 배열 연산은 불가능
var plusArr = threeDoubles + fourInts
//Binary operator '+' cannot be applied to operands of type '[Int]' and '[Double]’
  • 다양한 초기화 방법이 존재한다.
  • 같은 타입의 배열끼리 연산할 수 있다.
  • 다른 타입의 배열은 연산할 수 없다.
    • Binary operator '+' cannot be applied to operands of type '[Int]' and '[Double]’

1-2. 배열의 활용

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

1-2-1. 접근: 배열의 요소를 엑세스할 때는 액세스하려는 요소의 인덱스를 대괄호 안에 넣은 후 배열 이름 다음에 붙인다.

var arr_int:[Int] = [1, 2, 3, 4]
print(arr_int[3])    //4
arr_int[3] = 5
print(arr_int)       //[1, 2, 3, 5]


arr1[0...2]
//[0, 1, 2]

arr1[0...2] = [1,2,3]
//[1, 2, 3]

1-2-2. 반복문과 배열

var str = ["hi", "my", "name", "is", "su"]
for i in str {
    print(i)
}
//hi//my//name//is//su//배열값과 인덱스 얻기 - enumerate()메소드를 통해 index, value 튜플을 반환받을 수 있다.for (index, value) in str.enumerated(){
    print("index\\(index): \\(value)")
}
//index0: hi//index1: my//index2: name//index3: is//index4: su

1-2-3.  배열에 요소를 추가하는 함수

  • Array.append() 해당 배열과 동일한 타입의 값을 매개변수로 받아 해당 배열의 제일 마지막 요소로 추가

 

arr1.append(0); arr1.insert(1, at: 1);
arr1 += [2]
//[0, 1, 2]

//arr1.append(0); arr1.insert(1, at: 4);
//3번 요소가 없는데 4번에 값을 넣으려고 하면 Fatal error: Array index is out of range

//다른 타입은 추가할 수 없다.
arr1.append(1.1)
//Cannot convert value of type 'Double' to expected argument type 'Int'
  • 배열 접합(array concatenation): 배열에 여러 개의 요소를 한 번에 추가할 때 사용
arr_int += [6, 7]       //[1, 2, 3, 5, 6, 7]
  • Array.insert(newElement:, at:) 요소를 배열의 특정 인덱스 위치에 삽입하는 함수
    • 배열에 삽입할 값과 삽입될 위치를 나타내는 인덱스를 매개변수로 받음
    • at 매개변수를 사용하지 않으면 사용할 수 없다.
arr_int.insert(4, at: 3)      //[1, 2, 3, 4, 5, 6, 7]

1-2-4. Array.count() 열의 요소 개수를 반환하는 함수

arr.count
//3

1-2-5. Array.contains() 멤버 포함 여부 확인하는 함수

//arr1 = [1, 2, 3]
arr1.contains(1)
//true

arr1.contains(0)
//false//다른 타입을 contain의 파라미터로 넣을 수 없다.
arr1.contains(0.0)
//Cannot convert value of type 'Double' to expected argument type 'Int'

1-2-6. 멤버 교체

arr1[0] = 100
//[100, 2, 3]

1-2-7. 멤버 삭제

  • Array.remove(at: ) 삭제하고자 하는 배열의 요소를 지정해서 삭제하는 함수
  • Array.removeFirst() 배열의 제일 처음 요소를 삭제하는 함수
  • Array.removeLast() 배열의 제일 끝 요소를 삭제하는 함수
  • Array.removeAll() 배열의 모든 요소를 삭제하는 함수
arr1.remove(at: 0)
arr1.removeFirst()
//[2, 3]: 0번째 인덱스의 배열요소를 삭제

arr1.removeLast()
//[2]: 마지막 요소를 삭제

arr1.removeAll()
//[]: 전체 요소를 삭제

1-2-8. Array.isEmpty() 배열의 요소가 하나도 없는지 알아내는 함수

  • 배열이 비어 있으면 true, 그렇지 않으면 false
if arr1.isEmpty {
	print("empty")
}else{
	print("not empty")
}

//empty

//arr1은 아무 요소가 없는 빈 배열인 상황.
//인덱스를 벗어나 접근하면 익셉션 런타임 오류 발생
arr1[0]

1-2-9. Array.slice() 특정 범위의 배열 요소들을 반환하는 배열 함수

print(arr_int[1..<arr_int.count])    //[2, 3, 5]

1-2-10. 거꾸로 역순

  • reversed()함수는 새로운 배열을 리턴하는게 아니라 element을 역순으로 엑세스 할 수 있는 레퍼런스 유형을 반환
var arr2 = arr1.reversed() as [Int]
//[3, 2, 1]

 

2. Dictionary: 키(key)와 값(value)으로 구성된 데이터를 순서에 관계없이 저장하는 컬렉션

//딕셔너리의 선언과 생성 - key가 String타입이고 Value가 Any인 빈 Dictionary 생성
var anyDictionary: Dictionary<String, Any> = [String: Any]()

var dic1: Dictionary<String, Any> = [:]
var dic2: [String: Any] = Dictionary<String, Any>()
var dic3: [String: Any] = [String: Any]()
var dic4: [String: Any] = [:]
var dic5 = [String: Any]()

//Dictionary는 여러 리터럴 문법을 활용할 수 있어서 표현 방법이 다양합니다.
  • Dictionary는 키(key)와 값(value)의 쌍으로 이루어진 컬렉션 타입
    • 키는 고유값, 키를 기준으로 값을 처리: 딕셔너리는 key값의 중복을 허용하지 않음
    • 데이터 셋의 데이터가 쌍으로 조작될 때 해당 데이터들은 일대일 관계를 갖는다고 한다.
    • 동일한 데이터 타입의 값들을 여러 개 저장한다는 면에서 배열과 유사하나 키와 값이 한 쌍으로 된 형태로 저장된다는 것이 다르다.
  • 넣어준 순서대로 X, 가나다 정렬 X, 그냥 키와 값의 쌍으로 이루어진 구조
  • 키와 값 두 개의 타입을 지정, 두 가지 타입은 콜론으로 구분
  • var gpas: [String: Double] = ["철수": 3.01, "영희": 2.99, "연준": 3.55]

2-1. Dictionary의 생성과 초기화

var dicA: [String: String] = ["광해": "사극영화", "킹덤": "좀비사극영화", "부산행": "좀비영화"]
//dictionary의 value값에 배열이 들어갈 수 있다.
var dicB = ["초등학교": [1,2,3,4,5,6], "중학교": [1,2,3], "고등학교": [1,2,3]]
var dicC = Dictionary<Int, String>()
print(dicC) //[:]
  • 다양한 초기화 방법이 존재한다.
  • 딕셔너리끼리 연산할 수 없다.
    var dicA: [String: String] = ["광해": "사극영화", "킹덤": "좀비사극영화", "부산행": "좀비영화"] 
    var dicB = ["초등학교": [1,2,3,4,5,6], "중학교": [1,2,3], "고등학교": [1,2,3]] 
    var dicC = Dictionary<Int, String>() var dicD = ["좋좋소": "다큐"] 
    
    var dicE = dicA + dicD 
    //Binary operator '+' cannot be applied to two '[String : String]' operands 
    
    var dicF = [1:1] var dicG = [2:2] var dicH = dicF + dicG 
    //Binary operator '+' cannot be applied to two '[Int : Int]' operands
  • 딕셔너리도 변수, 상수, 배열처럼 타입을 명시적 또는 암시적으로 선언할 수 있다.
    var gpas: [String: Double] = ["철수": 3.01, "영희": 2.99, "연준": 3.55] //명시적 
    var speeds = ["레이": 80, "sm3": 100, "제네시스": 130] //암시적

2-2. Dictionary 활용

var gpas: Dictionary<String, Double> = [String: Double]()

2-2-1. 키에 해당하는 값 할당

gpas = ["철수": 3.01, "영희": 2.99]
gpas["연준"] = 3.55

//["철수": 3.01, "영희": 2.99, "연준": 3.55]

2-2-2. 접근: 대괄호 안에 딕셔너리의 키를 지정하여 각 키의 값을 출력한다.

print(gpas["철수"])    //Optional(3.01)

2-2-3. for-in 루프를 사용하면 딕셔너리의 모든 데이터를 순환 처리할 수 있다.

  • 변수 이름(name, gpa)에 적합한 것이라면 그 어떤 것을 사용해도 된다.
for (name, gpa) in gpas{
    print("\(name): \(gpa)")
}
//연준: 3.55
//영희: 2.99
//철수: 3.01


for key in gpas.keys{
    print(key)
}
//철수
//영희
//연준


for value in gpas.values{
    print(value)
}
//3.01
//2.99
//3.55

2-2-4. 딕셔너리에 새로운 요소를 추가할 때는 새로운 키-값 쌍의 데이터를 지정

speeds["쏘렌토"] = 120  //["쏘렌토": 120, "sm3": 100, "제네시스": 130, "레이": 80]

2-2-5. 변경

  • 키-값 쌍의 값을 변경(대입 연산자 활용)
speeds["레이"] = 70   //["레이": 70, "제네시스": 130, "쏘렌토": 120, "sm3": 100]
  • Dictionary.updateValue(value: , forKey:) 대입연산자를 사용하지 않고 키-값 쌍의 값을 변경
    • 키-값의 쌍의 값을 변경하기도 하지만, 변경된 요소의 원래 값도 반환해준다.
      var returnValue = speeds.updateValue(90, forKey: "sm3")  
      //["레이": 70, "제네시스": 130, "쏘렌토": 120, "sm3": 90]
      
      print(returnValue)    //Optional(100)
    • 없는 키 값을 updateValue하면 새로운 요소를 추가할 수 있다.
      speeds.updateValue(100, forKey: "티볼리")
      //["제네시스": 130, "쏘렌토": 120, "레이": 70, "sm3": 90, "티볼리": 100]

2-2-6. 개수 확인

speeds.count   //5

2-2-7. 삭제

  • nil 사용하기
speeds["쏘렌토"] = nil   
//["티볼리": 100, "제네시스": 130, "sm3": 90, "레이": 70]
  • Dictionary.removeValue(forKey: ) 딕셔너리에서 요소를 삭제하지만, 그 요소의 값을 반환하는 함수
var deletedValue = speeds.removeValue(forKey: "sm3")
//["티볼리": 100, "제네시스": 130, "레이": 70]
print(deletedValue)   //Optional(90)

 

2-2-8. 키에 해당 하는 값을 다른 상수나 변수에 할당할 때

let someValue: String = speeds["티볼리"]
//'Int?' is not convertible to 'String'
//“티볼리” 키에 해당하는 값이 없을 수 있고 || String 타입의 값이 나올거라는 보장이 없다.

let someValue = speeds["모닝"]
print(someValue) // nil
//타입이 명확하지 않은 경우에는 없는 값도 할당가능(nil)

 

2-2-9. Dictionary의 내용을 배열로 캐스팅

var arrKey = Array(speeds.keys)
print(arrKey)
//["티볼리", "제네시스", "레이"]

var arrValue = Array(speeds.values)
print(arrValue)
//[100, 130, 70]

 

3. Set

//Set의 선언과 생성, Set은 축약형이 없다.
var AnySet: Set<Int> = Set<Int>()
  • Set은 순서가 없고, 멤버가 유일한 것을 보장하는 컬렉션 타입.

3-1. Set의 선언과 생성

var set1: Set<Int> = Set<Int>()
set1.insert(1)
set1.insert(2)
set1.insert(100) //(inserted true, memberAfterInsert 100)
set1.insert(100) //(inserted false, memberAfterInsert 100)
set1.insert(100)
print(set1)
//[100, 2, 1]

print(set1.contains(1)) //true
print(set1.contains(1000)) //false

set1.remove(100)
set1.removeFirst()
print(set1) //[1]
print(set1.count) //1

3-2. Set의 집합연산

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

3-2-1. 합집합 unioin

let union: Set<Int> = setA.union(setB)
print(union) //[1, 2, 4, 5, 7, 6, 3]

3-2-2. 정렬

let sortedUnion: [Int] = union.sorted()
print(sortedUnion) //[1, 2, 3, 4, 5, 6, 7]

3-2-3. 교집합

let intersection: Set<Int> = setA.intersection(setB)
print(intersection) //[4, 5, 3]

3-2-4. 차집합

let subtracting: Set<Int> = setA.subtracting(setB)
print(subtracting) //[1, 2]

 

 

 

 

참고하였습니다. 감사합니다.

https://www.inflearn.com/course/lecture?tab=curriculum&courseSlug=창원대학교-박동규-교수의-swift-기초-강좌&unitId=1889 

 

학습 페이지

 

www.inflearn.com

https://youtu.be/FWFbZGoQPUI

23.07.04 수정) Swift 쉽게, 더 쉽게

https://www.yes24.com/Product/Goods/17652267

728x90