본 글은 야곰의 스위프트 프로그래밍: Swift5 교재를 토대로 공부한 내용과 찾아본 내용을 요약한 것입니다.
A = B : A에 B의 값을 할당. 서로 다른 데이터 타입이라면 오류 발생
A + B : A와 B를 더한 값 반환.
A - B : A에서 B를 뺀 값 반환.
A * B : A와 B를 곱한 값을 반환.
A / B : A를 B로 나눈 값을 반환.
A % B : A를 B로 나눈 값을 반환.
A == B :A와 B가 같은 값인지 비교하여 불리언 값 반환.
A >= B : A가 B보다 크거나 같은 값인지 비교하여 불리언 값 반환.
A <= B : A가 B보다 작거나 같은 값인지 비교하여 불리언 값 반환.
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 미만까지의 수를 묶어 범위 표현. B 포함하지 않음.
A... : A 이상의 수를 묶어 범위 표현. A 포함.
...A : A 이하의 수를 묶어 범위 표현. A 포함.
..<A : A 미만의 수를 묶어 범위 표현. A 포함하지 않음.
!B : B 불리언 값의 반전.
A && B : A와 B의 AND 논리 연산 실행.
A || B : A와 B의 OR 논리 연산 실행.
~B : A의 비트를 반전한 결과 반환.
A & B : A와 B의 비트 AND 논리 연산 실행.
A | B : A와 B의 비트 OR 논리 연산 실행.
A ^ B : A와 B의 비트 XOR 논리 연산 실행.
A >> B : A 비트를 B만큼 시프트. (오른쪽)
A << B : A 비트를 B만큼 시프트. (왼쪽)
// 비트 연산의 예시(2진수로 표기)
let a: UInt8 = 0b11110000 // 240 in decimal
let b: UInt8 = 0b00111100 // 60 in decimal
let result = a & b // 0b00110000, or 48 in decimal
print(result) // 출력: 48 // 기본적으로 10진수로 출력한다.
let binaryString = String(result, radix: 2) // 10진수 값을 2진수 문자열로 변환
print(binaryString) // 출력: "110000"
A += B : A = A + B
A -= B : A = A - B
A *= B : A = A * B
A /= B : A = A / B
A %= B : A = A % B
A <<=N : A = A << N
A >>=N : A = A >> N
A &= B : A = A & B
A |= B : A = A | B
A ^= B : A = A ^ B
Swift는 기본 연산자를 통해 오버플로에 대비할 수 있도록 합니다.
&+ : 오버플로 대비 덧셈 연산
&- : 오버플로 대비 뺄셈 연산
&* : 오버플로 대비 곱셈 연산
// 오버플로 연산자 예시
var unsignedInteger: UInt8 = 0
let errorUnderflowResult: UInt8 = unsignedInteger - 1 // 런타임 오류
let underFlowedValue: UInt8 = unsignedInteger &- 1 // 255
A ?? B : A가 nil이 아니면 A를 반환, nil이면 B를 반환 (nil 병합 연산자)
-A : A(수)의 부호를 변경 (부호변경 연산자)
O! : O(옵셔널 개체)의 값을 강제로 추출 (옵셔널 강제 추출 연산자)
V? : V(옵셔널 값)을 안전하게 추출하거나, V(데이터 타입)가 옵셔널임을 표현 (옵셔널 연산자)
연산자 우선순위
Swift의 연산자 우선순위는 대부분 다른 프로그래밍 언어와 유사합니다. 예를 들어, 곱셈(*)과 나눗셈(/) 연산자는 덧셈(+)과 뺄셈(-) 연산자보다 높은 우선순위를 가집니다. 이는 수학에서 사용하는 우선순위와 일치합니다. 따라서 Swift에서는 곱셈과 나눗셈 연산이 덧셈이나 뺄셈 연산보다 먼저 수행됩니다.
결합 방향
결합 방향은 같은 우선순위를 가진 연산자들 사이의 평가 순서를 정합니다. Swift의 대부분의 이항 연산자는 왼쪽에서 오른쪽으로 결합합니다. 예를 들어, 1 + 2 + 3은 왼쪽에서 오른쪽으로 평가되어 (1 + 2) + 3과 같이 처리됩니다. 하지만 할당 연산자(=)는 오른쪽에서 왼쪽으로 결합합니다. 이는 여러 변수에 동일한 값을 할당할 때 유용합니다. 예를 들어, a = b = c는 a = (b = c)와 같이 처리됩니다.
기존 연산자의 역할을 변경하거나 새로운 역할을 추가하기 위해서는 기존의 연산자가 전위 연산자인지, 중위 연산자인지, 후위 연산자인지 알아야하며 할당 연산자(=)와 삼항 연산자(?:)는 사용자 정의 역할을 부여할 수 없습니다.
전위 연산자는 변수나 값 앞에 위치합니다. 예를 들어, -a에서 -는 전위 연산자입니다. 사용자 정의 전위 연산자를 만들려면, 먼저 연산자를 선언하고 그 기능을 구현해야 합니다. 예를 들어, ~를 전위 연산자로 정의하여 특정 값을 변환하는 연산을 만들 수 있습니다.
prefix operator ~
prefix func ~(value: Int) -> Int {
return value * value
}
let result = ~5 // 25
중위 연산자는 두 값 사이에 위치합니다. 대부분의 산술 연산자가 여기에 해당합니다. 사용자 정의 중위 연산자를 만들 때는 연산자의 우선순위와 결합 방향도 지정할 수 있습니다. 예를 들어, ^^를 거듭제곱 연산자로 정의해보겠습니다.
infix operator ^^: MultiplicationPrecedence
func ^^(base: Int, power: Int) -> Int {
var result = 1
for _ in 0..<power {
result *= base
}
return result
}
let result = 2 ^^ 3 // 8
후위 연산자는 변수나 값 뒤에 위치합니다. 예를 들어, i++에서 ++는 후위 연산자입니다(비록 Swift에서는 ++ 연산자가 제거되었습니다). 사용자 정의 후위 연산자를 만들어 보겠습니다. 예를 들어, !를 사용하여 팩토리얼을 계산하는 후위 연산자를 만들 수 있습니다.
postfix operator !
postfix func !(value: Int) -> Int {
if value == 0 {
return 1
}
var result = 1
for i in 1...value {
result *= i
}
return result
}
let result = 5! // 120