Swift에서는 통상적으로 산술연산자, 논리연사자 a..<b, a…b 같이 값의 범위를 지정할 수 있는 범위연산자를 지원
용어(Terminology)
연산자에서는 단항(unary),이항(binary) 그리고 삼항(ternary)연산자가 있다.
- 단항 연산자는 -a, !b, c! 와 같이 하나의 대상에 앞뒤로 붙여 사용하는 연산자
- 이항 연산자는 2 + 3 같이 두 대상 사이에 위치하는 연산자
- 삼항 연산자는 a ? b : c 형태로 딱 하나
할당 연산자(Assignment Operator)
할당 연산자는 값을 초기화, 변경
let b = 10
var a = 5
a = b
// a 값은 10
let (x, y) = (1, 2)
// x 는 1, y 값은 2 가 됩니다.
사칙 연산자(Arithmetic Operators)
-
- 더하기
- 뺄셈
- 곱셈 / 나눗셈 % 나머지
1 + 2 // 3
5 - 3 // 2
2 * 3 // 6
10.0 / 2.5 // 4.0
9 % 4 // 1
단항 음수 연산자(Unary Minus Operator)
숫자 값은 -로 표현되는 단항 음수 연산자에 의해 부호가 변한다.
let three = 3
let minus Three = - three //minusThree 는 -3
합성 할당 연산자 (Compound Assignment Operators)
a = a + 2와 같이 할당연산(=)과 덧셈연산(+)으로 구성된 연산을 합성해 +=형태로 축약해 사용 가능 합니다.
var a = 1
a += 2
// a는 3
비교 연산자(Comparison Operators)
Swift에서는 표준 C에서 제공하는 비교 연산자를 모두 지원
- 같다 (a == b)
- 같지않다 (a != b)
- 크다 (a > b)
- 작다 (a < b)
- 크거나 같다 (a >= b)
- 작거나 같다 (a <= b)
각 비교 연산은 true or false 값을 반환 , if-else와 같은 조건 구문에서 자주 사용
let name = "world"
if name == "world" {
print("hello, world")
} else {
print("I'm sorry \\(name), but I don't recognize you")
}
// Prints "hello, world", because name is indeed equal to "world".
같은 타입의 값을 갖는 두 개의 튜플을 비교할 수 있습니다.
튜플의 비교는 왼쪽에서 오른쪽 방향으로 이뤄지고 한번에 한개의 값만 비교합니다.
이 비교를 다른 두 값을 비교하게 될 때까지 수행합니다.
(1, "zebra") < (2, "apple") // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문
(3, "apple") < (3, "bird") // true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문
(4, "dog") == (4, "dog") // true 왼쪽 4는 오른쪽 4와 같고 왼쪽 dog는 오른쪽 dog와 같기 때문
삼항 조건 연산자(Ternary Conditional Operator)
삼항 조건 연산자는 question ? answer1 : answer2의 구조를 갖습니다.
question = true → answer1 , question = false→ answer2
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight는 90 (40 + 50)
삼항 조건 연산자는 코드를 짧게 만들어 가독성을 높인다.
Nil 병합 연산자(Nil-Coalescing Operator)
nil 병합 연산자는 a ?? b 형태를 갖는 연산자 입니다. 옵셔널 a를 벗겨서(unwraps) 만약 a가 nil 인 경우 b를 반환합니다. 이 nil 병합 연산자는 다음 코드의 축약형입니다.
a != nil ? a : b // a가 nil이 아니면 a를 unwrap하고 nil이면 b를 반환
let defaultColorName = "red"
var userDefinedColorName: String? // 이 값은 defaults 값 nil입니다.
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorNam이 nil이므로 colorNameToUse 값은 defaultColorName인 "red"가 설정 됩니다.
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName가 nil이 아니므로 colorNameToUse 는 "green"이 됩니다.
범위 연산자(Range Operators)
닫힌 범위 연산자(Closed Range Operator)
(a...b)의 형태로 범위의 시작과 끝이 있는 연산자 입니다. for-in loop에 자주 사용
for index in 1...5 {
print("\\(index) times 5 is \\(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
반 닫힌 범위 연산자(Half-Open Range Operator)
(a..<b)의 형태로 a부터 b보다 작을 때까지의 범위를 갖습니다. 즉, a부터 b-1까지 값을 갖습니다.
반 닫힌 범위 연산자는 배열을 다루는데 유용
단방향 범위(One-Side Ranges)
[a..] [..a]의 형태로 범위의 시작 혹은 끝만 지정해 사용하는 범위 연산자
지정한 시작 값 혹은 끝 값은 범위에 포함
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("Person \\(i + 1) is called \\(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
for name in names[..<2] {
print(name)
}
// Anna
// Alex
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
논리 연산자(Logical Operators
Swift에서는 세가지 표준 논리 연산자를 지원합니다.
- 논리 부정 NOT (!a)
- 논리 곱 AND (a && b)
- 논리 합 OR (a || b)
논리 부정 연산자(Logical NOT Operator)
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
논리 곱 연산자(Logical AND Operator)
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
논리 합(OR) 연산자(Logical OR Operator)
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
논리 연산자의 조합(Combining Logical Operators)
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
Swift의 논리 연산자 && 와 || 는 왼쪽의 표현을 우선해서 논리 계산을 합니다
명시적 괄호(Explicit Parentheses)
논리 연산자의 적용 우선 순위를 연산자에 맡지기 않고 명시적으로 괄호를 사용해 계산 순서를 지정할 수 있습니다.
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
데이터 구조
데이터 구조 장점 단점
힙 | 매우 신속하게 삽입 및 삭제가 가능, | |
최대or최소에 대한 접근 속도 빠름 | 다른 요소에 대한 접근 느림 | |
트라이 | 데이터 접근 속도 빠름, | |
서로 다른 키값 충돌 X | ||
삽입,삭제 신속 | ||
문자열 딕셔너리 정렬,프리픽스 검색 유용 | 특정 상황에서 해시 테이블보다 속도가 느림. | |
이진 트리 | (균형 잡힌 트리구조일때)삽입, 삭제,검색 속도가 매우 빠르다. | 삭제 알고리즘 작성이 복잡, 트리구조가 삽입 순서에 영향, 성능이 저하 |
레드블랙 트리 | 삽입,삭제,검색 속도 매우 빠름, | |
트리는 항상 균형 상태 유지 | 한계 상황에서 데이터 구조를 운영하므로 구현이 까다로움 | |
R 트리 | 공간적 데이터를 나타낼때 good, | |
2차원 이상 구조를 지원 | 성능 검증 X | |
그래프 | 실제 세계의 상황을 반영한 모델 구현 | 일부 알고리즘은 느리고 복잡 |
알고리즘 개요
알고리즘 구현을 위한 자원이 매우 희박한 상태
알고리즘을 작성하려면 시간과 공간이 필요, 이 두가지가 가장 중요한 자원
문제의 규모를 측정할 때 함수의 점근 행동(asymptotic behavior)에 관심을 갖는다.
점근행동
- 두 개 알고리즘 기법을 비교하는 기초자료
- 문제 해결을 위한 함수의 크기가 커지는 속도보다 자원의 소모의 속도가 느리게 증가하는가를 확인
좋은 알고리즘이라면 규모가 큰 문제일수록 신속하게 해결
데이터 구조에서는 필수적으로 파악할 내용
- 새로운 데이터 아이템을 삽입하는 방법
- 데이터 아이템을 삭제하는 방법
- 특정 데이터 아이템을 찾는 방법
- 모든 데이터 아이템을 순회 하는 방법
- 데이터 아이템을 정렬하는 방법
스위프트에서의 데이터 타입
원천 데이터 타입이라고 하면 단일 값을 지니는 스칼라 타입을 일컫는 경우가 많다.
대표적인 스칼라 타입 데이터 하지만 Swift는 아님
- int
- float
- double
- char
- bool
스위프트에서 제공 하는 원천 데이터 타입
밸류 타입과 레퍼런스 타입
밸류 타입(value types)
- 오직 하나의 소유 객체만을 지님,
- 타입의 데이터가 변수or상수에 할당됐을 때 or 함수에 전달됐을 때, 지니고 있는 값 복사
- 구조체와 열거형, 스위프트의 모든 데이터 타입은 기본적으로 구조체
레퍼런스 타입(reference types)
- 값을 복사하지 않고 공유
- 변수에 할당하거나, 함수에 전달할 때 동일한 인스턴스를 참조값으로 활용
- 여러 개의 소유 객체가 참조라는 방식으로 공유
기명 타입과 복합 타입
기명 타입(named types)
- 사용자가 정의할 수 있는 데이터 타입
- 해당 타입이 정의될 당시 특정한 이름을 부여할 수 있는 타입
- 클래스, 구조체, 열거형, 프로토 타입
- 배열, 딕셔너리, 세트, 옵셔널 값을 나타낼 수 있는 기명타입 별도로 마련
- 익스텐션 선언을 통해 동작범위 확장
복합 타입(compound types)
- 별도 이름이 붙여지지 않는 타입
- function 타입과 type 타입등 두개의 복합 타입이 정의
- 기명 타입은 물론 다른 복합 타입을 포함 가능
- 튜플 타입은 두개의 요소를 포함, 첫번째 Int(기명타입), (Float,Float)라는 복합 타입(Int(Float,Float))
타입 에일리어스
- 기존의 타입을 또 다른 이름으로 부를 수 있는 방법
- typealias TCPPacket = UInt16
- 타입 에일리어스를 정의한 뒤에는 언제든지 어디서든지 해당 이름으로 원본 타입 사용
스위프트 표준 라이브러리의 컬렉션 타입
- 세트
- 딕셔너리
- 배열
정식은 아니지만 튜플도 있음, 튜플에서 정렬된 값은 어떤 타입 가능
'기타 > Today I Learned' 카테고리의 다른 글
[TIL] Swift 문법(문자열과 문자) (0) | 2023.04.17 |
---|---|
[TIL] 점근적 분석 & 사업계획서 (0) | 2023.03.29 |
[TIL] Switch문, 삼항연산자, 데이터구조 (0) | 2023.03.26 |
[TIL] Swift 문법(contains, allSatisfy) (0) | 2023.03.19 |
[TIL] iOS App 개발자는 무엇일까 (0) | 2023.03.14 |