[Swift] 연산자
참조 : Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)
연산자
- 특정한 문자로 표현한 함수
- 연산자에 의해 연산 되는 값의 수에 따라 단항, 이항, 삼항 등으로 구분
- 연산자 위치에 따라 전위. 중위, 후위 등으로 구분
비교 연산자
- 값을 할당할 때 사용하는 연산자
부호 | 설명 |
A === B | A와 B가 참조(레퍼런스) 타입일 때 A와 B가 같은 인스턴스를 가리키는지 비교하여 불리언 값을 반환 |
A !== B | A와 B가 참조(레퍼런스) 타입일 때 A와 B가 같지 않은 인스턴스를 가리키는지 비교하여 불리언 값을 반환 |
A ~= B | A와B의 패턴이 매치되는지 확인하여 불리언 값을 반환 |
삼항 조건 연산자
- 피연산자가 세 개인 삼항 조건 연산자
부호 | 설명 |
Question ? A:B | Question(불리언 값)이 참이면 A, 거짓이면 B를 반환 |
범위 연산자
- 값(수)의 범위를 나타내고자 할 때 사용
연산자 | 부호 | 설명 |
폐쇄 범위 연산자 | A...B | A부터 B까지의 수를 묶어 범위를 표현 A와 B를 포함 |
반폐쇄 범위 연산자 | A..<B | A부터 B미만까지의 수를 묶어 범위를 표현 A를 포함, B는 포함하지 않음 |
단방향 범위 연산자 | A... | A 이상의 수를 묶어 표현, A를 포함 |
...A | A 이하의 수를 묶어 표현, A를 포함 | |
..<A | A 미만의 수를 묶어 표현, A를 포함하지 않음 |
복합 할당 연산자
- 할당 연산자와 다른 연산자가 하는 일을 한 번에 할 수 있도록 결합할 수 있음
표현 | 설명 | 같은 표현 |
A += B | A와 B의 합을 A에 할당 | A = A + B |
A -= B | A와 B의 차를 A에 할당 | A = A - B |
A *= B | A와 B의 곱을 A에 할당 | A = A * B |
A /= B | A를 B로 나눈 값을 A에 할당 | A = A / B |
A %= B | A를 B로 나눈 나머지를 A에 할당 | A = A % B |
오버플로 연산자
- 기존 프로그래밍 언어에서는 오버플로 가능성 있는 연산에 대해 따로 추가 알고리즘 및 로직들을 설계했음
- Swift에서는 연산자를 통해 오버플로 대비, 오버플로 연산자를 사용하여 오버플로를 자동으로 처리
연산자 | 부호 | 설명 |
오버플로 더하기 연산 | &+ | 오버플로에 대비한 덧셈연산 |
오버플로 빼기 연산 | &- | 오버플로에 대비한 뺄셈연산 |
오버플로 곱하기 연산 | &* | 오버플로에 대비한 곱셈연산 |
기타 연산자
연산자 | 부호 | 설명 |
nil 병합 연산자 | A ?? B | A가 nil이 아니면 A를 반환하고, A가 nil이면 B를 반환 (옵셔널 사용할 때 매우 유용) |
부호변경 연산자 | -A | A(수)의 부호를 변경 |
옵셔널 강제 추출 연산자 | O! | O(옵셔널 개체)의 값을 강제로 추출 |
옵셔널 연산자 | V? | V(옵셔널 값)를 안전하게 추출하거나, V가 옵셔널임을 표현 |
※ 옵셔널 강제 추출 연산자 사용하는 것을 지양하는 것이 좋음
연산자의 우선순위
- 연산자의 우선순위가 지정 되어 있음
- 우선순위가 높은 연산자가 제일 먼저 실행
- 결합방향도 지정 되어 있음
- 스위프트 연산자의 연산자 우선순위는 절대치가 아닌 상대적인 수치
연산자 우선순위 그룹
- 연산자 뒤에 콜론을 붙이고 이어서 작성하여 지정
사용자 정의 연산자
- 기존 연산자의 역할을 변경하거나 새로운 역할을 추가하기 위해서는 기존의 연산자가 전위 연산자인지, 중위 연산자인지,
후위 연산자인지 알아야 함
- 전위 연산자(prefix) : 연산자가 피연산자 앞에 위치하는 연산자 ex) 부울 부정 논리 연산(NOT) 연산자(!)
- 중위 연산자(infix) : 피연산자 사이에 위치하는 연산자, 많은 수의 연산자가 여기에 속함
- 후위 연산자(postfix) : 피연산자 뒤에 위치하는 연산자 ex) 옵셔널 강제추출 연산자
- operator(연산자), associativity(연산자 결합방향), precedence(우선순위)
- 아스키문자(ASCII Code)와 결합해서 사용
- .(마침표)를 사용자 정의 연산자에 사용 가능, 연산자를 표현하는 문자 중 맨 처음의 문자가 마침표일 때만 연산자에 포함된
마침표가 연산자로 인식됨, 만약 마침표로 시작되지 않는 연산자에 마침표가 들어가게 되면 이를 인식 불가
- ?(물음표), !(느낌표) 자체만으로는 사용자 정의 연산자를 정의할 수 없음
- 전위 연산자는 ! 나 ? 시작하는 사용자 정의 연산자를 정의할 수 없음
- 예약어는 재정의 할 수 없음
- 전위 연산자 구현과 사용
prefix operator **
prefix func ** (value: Int) -> Int{
return value * value
}
let minusFive: Int = -5
let sqrtMinusFive: Int = **minusFive
print(sqrtMinusFive) // 25
- 후위 연산자 구현과 사용
※ 하나의 피연산자에 전위 연산과 후위 연산을 한 줄에 사용하게 되면 후위 연산을 먼저 수행
postfix operator **
postfix func ** (value: Int) -> Int{
return value + 10
}
let five: Int = 5
let fivePlusTen: Int = five**
print(fivePlusTen) // 15
- 중위 연산자의 구현과 사용
- 중위 연산자는 우선순위 그룹을 명시할 수 있음
- precedencegroup 뒤에 그룹 이름을 써주어 정의
- associativity에 결합방향이 있는 것은 연달아 사용 가능, 결합방향이 없는(부등호 연산자) 경우 연달아 사용 불가
- 옵셔널 체이닝이 있는 경우에는 연산자의 우선순위 지정 → 연산자에 옵셔널 체이닝이 있는 경우 왼쪽부터 옵셔널 체이닝
- 우선순위 그룹을 명시하지 않으면 가장 우선순위가 높은 DefaultPrecedence그룹을 우선순위 그룹으로 가짐
precedencegroup 우선순위 그룹 이름{
higherThan: 더 낮은 우선순위 그룹 이름
lowerThan: 더 높은 우선순위 그룹 이름
associativity: 결합방향(left / right / none)
assignment: 할당방향 사용(true / false)
}
- 중위 연산자의 구현과 사용
// String 타입의 contains(_:) 매서드를 사용하기 위해 import
import Foundation
infix operator ** : MultiplicationPrecedence
func ** (lhs: String, rhs: String) -> Bool{
return lhs.contains(rhs)
}
let helloKim: String = "Hello Kim"
let kim: String = "Kim"
let isContainsKim: Bool = helloKim ** Kim // true
'iOS > Swift' 카테고리의 다른 글
[Swift] 옵셔널(Optional) (0) | 2022.09.15 |
---|---|
[Swift] 함수 (0) | 2022.09.14 |
[Swift] 맵, 필터, 리듀스 (0) | 2022.09.14 |
[Swift] regular expression (0) | 2022.09.07 |
[Swift] 배열 (0) | 2022.09.07 |