으니의 개발로그

[Swift] 연산자(1) - 연산자의 종류 본문

Swift/책 정리

[Swift] 연산자(1) - 연산자의 종류

아잉으니야 2021. 1. 19. 22:24

[Swift] 연산자(1) - 연산자의 종류

이 글은 Swift 프로그래밍 책을 읽고 요약한 내용입니다.

 

띄워쓰기와 연산자

스위프트에서는 띄어쓰기도 중요한 문법 중 하나이다. 예를 들어 A != BA! = B 는 전혀 다른 의미이다. 또, A > B? A : B 는 잘못된 사용이며 물음표를 B에서 띄어 써야 한다.

 

 

1. 할당 연산자

값을 할당할 때 사용하는 연산자

 

연산자

부호 설명
할당(대입) 연산자 A = B A에 B의 값을 할당한다. 서로 다른 데이터 타입이라면 오류가 발생함.

 

 

2. 산술 연산자

수학에서 쓰이는 연산자와 같은 역할을 수행

 

연산자 부호 설명
더하기 연산자 A + B A와 B를 더한 값을 반환
빼기 연산자 A - B A에서 B를 뺀 값을 반환
곱하기 연산자 A * B A와 B를 곱한 값을 반환
나누기 연산자 A / B A를 B로 나눈 값을 반환
나머지 연산자 A % B A를 B로 나눈 나머지를 반환

 

스위프트의 나머지 연산과 나누기 연산자

스위프트에서는 부동소수점 타입의 나머지 연산까지 지원한다.

let number: Double = 5.0
var result: Double = number.truncatingReminder(dividingBy: 1.5)
/* 0.5 */
result = 12.truncatingRemainder(dividingBy: 2.5)
/* 2.0 */

나누기 연산은 기존의 프로그래밍 언어처럼 나머지나 소수점을 제외한 정수만 결과값을 반환한다.

var result: Int = 5 / 3
/* 1 */
result = 10 / 3
/* 3 */

또한, 스위프트는 데이터 타입에 굉장히 엄격하므로 서로 다른 자료형끼리의 연산을 엄격히 제안한다. 서로 다른 자료형끼리 연산을 실행하려면 값을 해당 타입으로 변환한 후 연산해야 한다. 심지어 같은 정수 타입인 IntUInt 타입끼리의 연산도 엄격히 제한한다.

 

 

3. 비교 연산자

두 값을 비교할 때 사용

 

연산자 부호 설명
값이 같다 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의 패턴이 매치되는지 확인하여 불리언 값을 반환한다.

 

참조 비교 연산자

스위프트의 유일한 참조(Reference) 타입인 클래스의 인스턴스에서만 참조 비교 연산자를 사용할 수 있다. 스위프트의 기본 데이터 타입은 모두 구조체로 구현되어 있기 때문에 값 타입이다. 그렇기 때문에 값의 비교 연산자는 == 를 사용하고 클래스의 인스턴스인 경우에만 === 를 사용한다.

import UIKit

let valueA: Int = 3
let valueB: Int = 5
let valueC: Int = 5

let isSameValueAB: Bool = valueA == valueB
/* false */
let isSameValueBC: Bool = valueB == valueC
/* true */

let referenceA: SomeClass = SomeClass()
let referenceB: SomeClass = SomeClass()
let referenceC: SomeClass = referenceA

let isSameReferenceAB: Bool = referenceA === referenceB
/* false */
let isSameReferenceAC: Bool = referenceA === referenceC
/* true */

 

 

4. 삼항 조건 연산자

피연산자가 세 개인 삼항 조건 연산자

 

연산자 부호 설명
삼항 조건 연산자 Question ? A : B Question(불리언 값)이 참이면 A를 거짓이면 B를 반환한다

 

var valueA: Int = 3
var valueB: Int = 5
var biggerValue: Int = valueA > valueB ? valueA : valueB
/* 5 */

valueA = 0
valueB = -3
biggerValue = valueA > valueB ? valueA : valueB
/* 0 */

var stringA: String = ""
var stringB: String = "String"
var resultValue: Double = stringA.isEmpty ? 1.0 : 0.0
/* 1.0 */
resultValue = stringB.isEmpty ? 1.0 : 0.0
/* 0.0 */

조건 안에 또 다른 삼항 연산자를 넣을 수도 있고, 여러 번 중첩할 수도 있다.

 

 

5. 범위 연산자

값(수)의 범위를 나타내고자 할 때 사용한다.

 

연산자 부호 설명
폐쇄 범위 연산자 A...B A이상 B이하의 수를 묶어 범위를 표현한다.
반폐쇄 범위 연산자 A.. < B A이상 B미만까지의 수를 묶어 범위를 표현한다.
단방향 범위 연산자 A... A 이상의 수를 묶어 범위를 표현한다.
  ...A A 이하의 수를 묶어 범위를 표현한다.
  .. < A A 미만의 수를 묶어 범위를 표현한다.

 

 

6. 부울 연산자

불리언 값의 논리 연산을 할 때 사용한다.

 

연산자 표현 설명
NOT(부정) 부울 연산자 !B B(불리언 값)의 참, 거짓을 반전한다.
AND 부울 연산자 A && B A와 B의 불리언 AND 논리 연산을 실행한다.
OR 부울 연산자 A || B A와 B의 불리언 OR 논리 연산을 실행한다.

 

 

7. 비트 연산자

값의 비트 논리 연산을 위한 연산자

 

연산자 표현 설명
NOT(부정) 비트 연산자 ~A A의 비트를 반전한 결과를 반환한다.
AND 비트 연산자 A & B A와 B의 비트 AND 논리 연산을 실행한다.
OR 비트 연산자 A | B A와 B의 비트 OR 논리 연산을 실행한다.
XOR 비트 연산자 A ^ B A와 B의 비트 XOR 논리 연산을 실행한다.
비트 이동 연산자(시프트 연산자) A >> B
A << B
A의 비트를 B만큼 비트를 시프트(이동)한다.

 

 

8. 복합 할당 연산자

할당 연산자와 다른 연산자가 하는 일을 한 번에 할 수 있도록 연산자를 결합할 수 있다. 이를 복합 할당 연산자라고 한다.

 

표현 설명 같은 표현
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
A <<= N A를 N만큼 왼쪽 비트 시프트 한 값을 A에 할당한다. A = A << N
A >>= N A를 N만큼 오른쪽 비트 시프트 한 값을 A에 할당한다. A = A >> N
A &= B A와 B의 비트 AND 연산 결과를 A에 할당한다. A = A & B
A |= B A와 B의 비트 OR 연산 결과를 A에 할당한다. A = A | B
A ^= B A와 B의 비트 XOR 연산 결과를 A에 할당한다. A = A ^ B

 

 

9. 오버플로 연산자

스위프트는 기본 연산자를 통해 오버플로에 대비할 수 있다. 오버플로 연산자를 사용하면 오버플로를 자동으로 처리한다.

 

연산자 부호 설명
오버플로 더하기 연산 &+ 오버플로에 대비한 덧셈 연산을 합니다.
오버플로 빼기 연산 &- 오버플로에 대비한 뺄셈 연산을 합니다.
오버플로 곱하기 연산 &* 오버플로에 대비한 곱셈 연산을 합니다.

 

예를 들어 UInt8 타입은 8비트 정수 타입으로 부호가 없는 양의 정수만을 표현하기 때문에 0 아래로 내려가는 계산을 하면 런타음 오류가 발생한다. 그렇지만 오버플로 빼기 연산을 사용하면 오류 없이 오버플로 처리를 해준다.

var unsignedInteger: UInt8 = 0
let errorUnderflowResult: UInt8 = unsignedInteger - 1
/* 런타임 오류 */
let underflowdValue: UInt8 = unsignedInteger &- 1
/* 255 */

unsignedInteger = UInt8.max
/* 255 */
let errorOverflowResult: UInt8 = unsignedInteger + 1
/* 런타임 오류 */
let overflowedValue: UInt8 = unsignedInteger &+ 1
/* 0 */

 

 

10. 기타 연산자

연산자 부호 설명
null 병합 연산자 A ?? B A가 null이 아니면 A를 반환하고, A가 nil이면 B를 반환한다.
부호변경 연산자 -A A(수)의 부호를 변경한다.
옵셔널 강제 추출 연산자 O! O(옵셔널 개체)의 값을 강제로 추출한다.
옵셔널 연산자 V? V(옵셔널 값)를 안전하게 추출하거나, V(데이터 타입)가 옵셔널임을 표현한다.

 

nil 병합 연산자

nill 병합 연산자는 옵셔널을 사용할 때 아주 유용한 연산자이다.

let valueInt: Int = someOptionalInt != nil ? someOptionalInt! : 0

// 위 코드와 같은 결과를 볼 수 있지만 훨씬 안전하게 옵셔널을 다룰 수 있다.
let valueInt: Int = someOptionalInt ?? 0