일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- next.js
- 비반환함수
- 함수형프로그래밍
- lineending
- textinput
- reactnavigation
- SWIFT
- ios
- DelayInput
- 프로그래머스
- 리액트네이티브
- 옵셔널
- 약타입언어
- ReactNative
- 동적언어
- multiline
- switch구문
- 중첩함수
- JavaScript
- reactnative android
- 스위프트
- beforePopState
- 약타입
- 나를부르는숲
- 데이터타입함수
- 72410
- 17681
- Server-Side-Rendering
- replacingOccurrences
- client-side-rendering
- Today
- Total
으니의 개발로그
[Swift] 연산자(1) - 연산자의 종류 본문
[Swift] 연산자(1) - 연산자의 종류
이 글은 Swift 프로그래밍 책을 읽고 요약한 내용입니다.
띄워쓰기와 연산자
스위프트에서는 띄어쓰기도 중요한 문법 중 하나이다. 예를 들어
A != B
와A! = 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 */
또한, 스위프트는 데이터 타입에 굉장히 엄격하므로 서로 다른 자료형끼리의 연산을 엄격히 제안한다. 서로 다른 자료형끼리 연산을 실행하려면 값을 해당 타입으로 변환한 후 연산해야 한다. 심지어 같은 정수 타입인
Int
와UInt
타입끼리의 연산도 엄격히 제한한다.
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
'Swift > 책 정리' 카테고리의 다른 글
[Swift] 조건문(2) - switch 구문 (0) | 2021.01.22 |
---|---|
[Swift] 조건문(1) - if 구문 (0) | 2021.01.20 |
[Swift] 데이터 타입 고급(3) - 열거형 (0) | 2021.01.12 |
[Swift] 데이터 타입 고급(2-2) - 컬렉션에서 임의의 요소 추출과 뒤섞기 (2) | 2021.01.09 |
[Swift] 데이터 타입 고급(2-1) - 컬렉션형(배열, 딕셔너리, 세트) (0) | 2021.01.08 |