일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 후위 연산자
- 깃허브 페이지
- react
- Crawling
- 워들
- 리액트 배포
- Apple HIG
- 리액트
- 파이썬
- 데이터타입
- 크롤링
- 중위 연산자
- 워들 사이트
- SWiFT
- 스위프트
- Python
- 백준 문제
- Github
- 프로젝트
- HIG 한글 번역
- 전위 연산자
- 파이썬 깃허브 푸시
- wordle 사이트
- 깃허브 푸시
- XCTest
- 스위프트 기초
- HIG 한글
- 깃허브 페이지 배포
- 사용자 정의 연산자
- github push
- Today
- Total
Jeonhui {ios}
[swift] (2) 고급데이터타입 본문
2022.02.23 - [swift] - [swift] (1) 변수와 상수, 데이터타입
안녕하세요. Jeonhui입니다.
이번 시간에는 swift의 고급 데이터 타입에 대해 알아보도록 하겠습니다.
기본 데이터 타입에 대한 설명은 이전 글을 참고해주세요.
우선, swift의 변수나 상수는 데이터 타입을 지정하지 않고, 다음과 같이 선언을 하는 것이 가능합니다.
var a = 1
이러한 경우, 컴파일러는 선언된 값을 기준으로 타입 추론을 하여 a변수에 Int타입을 지정합니다.
또한, 타입의 이름을 사용자가 임의로 지정할 수 있습니다.
typealias UserInt = Int
var value: UserInt = 100
위와 같이 사용할 수 있습니다.
고급 데이터 타입
튜플
튜플은 '지정된 데이터의 묶음'이라고 할 수 있습니다.
데이터의 개수는 자유롭게 지정할 수 있습니다.
튜플은 아래와 같이 선언할 수 있습니다.
var person: (String, Int, Double) = ("name",10,180.3)
하지만, 위와 같이 지정할 경우 사용자는 각각의 값들이 어떤 값인지 알 수 없습니다.
그렇기 때문에 아래와 같이 이용하는 것이 더 직관적입니다.
var person: (name: String,age: Int,height: Double) = ("name",10,180.3)
컬렉션형 (배열, 딕셔너리, 세트)
배열
배열의 경우 데이터를 담을 수 있는 상자를 일렬로 나열한 것이라고 생각하시면 됩니다.
var names: Array<String> = ["James","Johnny","Kate"]
var names: [String] = ["James","Johnny","Kate"]
[String] 는 Array<String>의 축약형이기 때문에 위 두 줄의 코드는 같은 역할을 하게 됩니다.
빈 배열을 생성하기 위해서
var emptyArray: Any = Array<Any>()
var emptyArray: Any = [Any]()
빈 배열을 생성하는 Array<Any>() 또한, [Any]()로 사용할 수 있습니다.
배열의 타입을 정확히 명시해줬다면 타입 추론이 필요 없으므로 []만 이용해서도 선언이 가능합니다.
var emptyArray: Any = []
배열의 접근은 ArrayName[index]로 접근을 할 수 있습니다.
var a: [Int] = [1,2,3,4,5]
print(a[0]) //1
print(a[1]) //2
이때 잘못된 인덱스에 접근하는 경우 Exception Error이 발생합니다.
배열에서 사용할 수 있는 함수는 다음과 같습니다.
배열.isEmpty | 배열이 비어있는 지 확인 (true, false) |
배열.count | 배열 안 요소의 개수 (Int) |
배열.firstIndex(of: ) 배열.lastIndex(of: ) |
해당 요소의 인덱스 찾기 (가장 먼저 발견되는 요소의 인덱스 반환) |
배열.append( _: or contentsOf: ) | _ - 맨 뒤에 요소 추가 contentsOf - 배열을 뒤에 붙임 |
배열.insert(_: at: or contentsOf: at: ) | _ - 해당 인덱스에 요소 삽입 contentsOf - 배열을 해당 인덱스에 삽입 |
배열.remove(at: ) | 해당인덱스의 요소가 삭제된 후 반환 |
딕셔너리
딕셔너리는 단어장과 같다고 생각하시면 됩니다.
단어장이 단어: 의미와 같이 이루어지듯이 키와 값들로 이루어지는 것이 딕셔너리입니다.
하지만, 한 단어의 의미가 여러 개일 경우, 같은 키를 다시 사용하지 못하는 것이 차이점입니다.
var word: Dictionary<String, String> = ["Array":"배열","Dictionary":"사전"]
var word: [String: String] = ["Array":"배열","Dictionary":"사전"]
var rankAndName: Dictionary<Int, String> = Dictionary<Int, String>()
var rankAndName: [Int: String] = [Int:String]()
var rankAndName: [Int: String] = [:]
딕셔너리는 배열과 비슷하게 사용을 할 수 있습니다.
배열과 비슷하게 Dictionary<String, String>와 [String: String]는 같은 의미이고,
Dictionary<Int, String>() 또는 [Int: String]()를 사용하여 빈 배열을 만들 수 있으며
타입이 명확하게 명시되어있다면 [:]만으로도 빈 배열을 생성할 수 있습니다.
딕셔너리 값의 접근은 Dictionary[key]로 접근합니다.
딕셔너리의 키는 유일해야하며, 값은 유일하지 않아도 됩니다.
특정 값을 제거할 때에는 키를 이용하여 removeValue(forKey: )메소드를 사용합니다.
딕셔너리의 없는 키를 이용해 접근을 할 경우 nil을 반환합니다.
세트
세트는 수학의 조합을 의미합니다.
수학의 조합과 같이 순서는 의미없고, 각 요소가 유일한 값이어야 하는 경우 사용합니다.
세트는 다음과 같이 선언합니다.
var setValue: Set<String> = Set<String>()
var setValue: Set<String> = []
setValue.isEmpty
setValue.count
setValue.insert("a")
setValue.remover("a")
배열과 같이 빈 배열을 선언할 수 있으므로 타입을 명확하게 명시하지 않는다면,
컴파일러는 배열로 타입 추론을 하기 때문에 이 점 유의하시기 바랍니다.
세트는 조합을 의미하기 때문에 조합의 연산을 할 수 있습니다.
세트.intersection(세트2) | 교집합 반환 |
세트.symmetricDifference(세트2) | 여집합의 합(배타적 논리합) 반환 |
세트.union(세트2) | 합집합 반환 |
세트.subtracting(세트2) | 차집합 반환 |
세트.sorted()
sorted()메소드를 이용해 세트를 정렬된 배열로 반환해 줄 수 있습니다.
또한, 세트에서 다음과 같은 메소드를 사용할 수 있습니다.
세트.isDisjoint(with: 세트2) | 서로 배타적인지 (true, false) |
세트.isSubset(of: 세트2) | 세트가 세트2의 부분집합인지 (true, false) |
세트.isSuperset(with: 세트2) | 세트2의 전체집합인지 (true, false) |
열거형
제한된 선택지를 주고 싶을 때에는 열거형이 사용됩니다.
열거형이 조금 생소하실 수도 있을텐데
열거형은 학생과 같이 초등학생, 중학생, 고등학생, 대학생, 대학원생 등과 같이 예상된 입력값들이 한정적인 경우 사용됩니다.
열거형의 각 항목은 원시값의 형태로 실제 값을 가질 수 있고, 연관값을 사용하여 값의 묶음도 구현할 수 있습니다.
열거형은 다음과 같이 enum키워드를 사용하여 선언 합니다.
enum School {
case elementary
case middle
case high
case college
case university
case graduate
}
enum School {
case elementary, middle, high, college, university, graduate
}
원시값은 아래와 같이 사용됩니다.
enum num: Int {
case zero = 0
case one = 1
case two = 2
}
enum num: Int {
case zero = 0, one = 1, two = 2
}
var n: num = num.zero
print("\(n.rawValue)")
.rawValue프로퍼티를 이용하여 원시값을 그대로 사용할 수 있습니다.
이때 원시값을 사용해주기 위해서는 타입을 명시해줘야 합니다.
원시값을 통해서 열거형 초기화를 할 수 있습니다.
let one = num(rawValue: 1)
let three = num(rawValue: 3) //지정이 안 되어있으므로 nil 반환
열거형 내의 항목이 자신과 연관된 값을 가질 수 있습니다. 이를 연관값이라 합니다.
enum School {
case elementary
case middle
case high
case college(score: Double)
case university(grade: String, score: Double)
case graduate
}
var mySchool:School = School.university(grade:"3", score: 4.5)
모든 항목이 연관값을 가질 필요는 없고, 소괄호로 묶어 표현을 합니다.
연관값에 값을 주기위해서는 소괄호 안에 해당 프로퍼티에 값을 주면 됩니다.
열거형의 항목들을 순회하는 방법은
allCases라는 프로퍼티를 사용하면 됩니다.
이때 데이터 타입 부분에 CaseIterable을 주어야합니다. 이미 데이터 타입이 지정되어있다면, ','를 사용한 뒤 주면 됩니다.
연관값은 사용이 되지 않습니다.
enum School: String, CaseIterable {
case elementary
case middle
case high
case college
case university
case graduate
}
let allCases: [School] = School.allCases
print(allCases)
순환 열거형
순환 열거형은 연관 값이 열거형 자신의 값이고자 할 때 사용됩니다.
indirect 키워드를 이용하여 선언합니다.
enum num{
indirect case zero(num)
case one
case two
}
indirect enum num2{
case zero(num), one(num), two(num)
}
위와 같이 특정 항목에 순환 열거형을 지정할 수도 있고, 전체 항목에 지정할 수 있습니다.
Comparable 프로토콜을 이용하면 각 케이스를 비교할 수 있습니다.
이때 앞에 위치한 케이스가 더 적은 값이 됩니다.
enum num2: Comparable{
case zero, one, two
}
print("\(num.one > num.two)") //false
이번 시간에는 여기서 마치겠습니다. 잘못된 부분이 있을 경우 댓글을 남겨주세요. :)
긴 글 읽어주셔서 감사합니다.
'swift' 카테고리의 다른 글
[swift] (3) 연산자 (0) | 2022.03.02 |
---|---|
[swift] (1) 변수와 상수, 데이터타입 (0) | 2022.02.23 |