2022. 3. 6. 19:27ㆍSwift 기초 정리
//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎
- 컬렉션 타입: 여러 값들을 모아서 저장하는 데이터 타입
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]
참고하였습니다. 감사합니다.
23.07.04 수정) Swift 쉽게, 더 쉽게
'Swift 기초 정리' 카테고리의 다른 글
[Swift 기초] 제어구문-반복문 (0) | 2022.03.07 |
---|---|
[Swift 기초] 제어구문 - 조건문(흐름제어) (0) | 2022.03.07 |
[Swift 기초] 튜플 Tuple (0) | 2022.03.06 |
[Swift 기초] Any, AnyObject, nil (0) | 2022.02.17 |
[Swift 기초] 기본 데이터 타입 (0) | 2022.02.17 |