Operator Basics
a + b // a와 b는 operand(피연산자)라고 하고, +는 operator(연산자) 라고 한다.
연산자는 피연산자의 개수에 따라 구분할 수 있다.
- unary operator(단항 연산자) → +a, a!, !c
- binary operator(이항 연산자) → a + b
- ternary operator(삼항 연산자) → a ? b : c
연산자의 위치에 따라 구분할 수 있다.
- prefix operator(전치 연산자) → +a
- postfix operator(후치 연산자) → a+
- infix operator → a+ b
연산자는 우선순위를 가지고 있으며 높은 우선순위대로 실행된다.
또한 괄호 ( )로 묶어서 우선순위 지정이 가능하다.
우선순위가 없을 경우 좌결합성으로 계산한다.
Associativity(결합 규칙)
- left Associative(좌결합성) → 왼쪽에서 오른쪽으로
- right Associative(우결합성) → 오른쪽에서 왼쪽으로
산술 연산자(Arithmetic Operator)
- 스위프트는 표준 산술 연산자를 모든 숫자 타입에 지원한다.
- 종류
- 덧셈(+)
- 뺄셈(-)
- 곱셈(*)
- 나눗셈(/)
- 나머지(%)
+a (Unary plus operator)
- 단항으로 쓰일 땐 현재값을 그대로 반환해준다.
let a = 10
+a // 10
-a (Unary minus operator)
- 단항으로 쓰일 땐 부호를 반전해준다.
let a = 10
-a // -10
a + b (Addition operation, 덧셈)
let a = 10
let b = 20
a + b // 30
a - b (Subraction operator, 뺄셈)
let a = 30
let b = 20
a - b // 10
a * b (Multiplication operator, 곱셈)
let a = 3
let b = 5
a * b // 15
a / b (Division operator, 나눗셈)
let a = 10
let b = 2
a / b // 5
let a = 56.78
let b = 12.34
a / b // 4.60129659643436
a % b (Remainder operator, 나머지)
- 나눗셈을 수행하고 나머지를 리턴해준다.(정수(Int)타입만 지원)
- 실수에 사용하고 싶다면 truncatingRemainder(dividingBy:)를 사용하면 된다.
let a = 10
let b = 5
a % b // 0
Overflow(오버플로우)
- 값의 범위를 벗어나면 발생하며, 이러한 오류 해결 및 특정 패턴을 구현하기 위해서 Overflow 연산자를 사용한다.
- 연산자 앞에 &만 붙여주면 오버플로우를 허용할 수 있다.
덧셈에서 오버플로우 허용하기
// Int8 범위 - -128 ~ 127
let a: Int8 = Int8.max // 127
let b: Int8 = a + 1 // overflow!!
let c: Int8 = a &+ 1 // 128
뺄셈에서 오버플로우 허용하기
// Int8 범위 - -128 ~ 127
let a: Int8 = Int8.min // -128
let b: Int8 = a - 1 // overflow!!
let c: Int8 = a &- 1 // 127
곱셈에서 오버플로우 허용하기
// Int8 범위 - -128 ~ 127
let a: Int8 = Int8.min // -128
let b: Int8 = a * 2 // overflow!!
let c: Int8 = a &* 2 // 0
비교 연산자(Comparison Operator)
- 두개의 값을 비교하는 연산자이다.
- 항상 이항연산자이며 비교한 조건이 맞다면 true 틀리다면 false를 반환한다.
- 자료형은 항상 Boolean이다.
- 종류
- ==
- !=
- >
- <
- >=
- <=
== (Equal to operator)
- a == b → a와 b가 같을때 true를 반환한다.
- "a" == "a" → 문자열 비교도 가능하며 대소문자 비교까지 가능하다.
- 단, 비교할때는 같은 자료형만 비교 가능!!
let a = 10
let b = 10
a == b // true
let a = 10
let b = 20
a == b // false
let a = "a"
let b = "a"
a == b // true
let a = "a"
let b = "b"
a == b // false
let a = "a"
let b = "A"
a == b // false
!= (Not equal to operator)
- a != b → a와 b의 값이 다를때 true를 반환한다.
let a = 10
let b = 20
a != b // true
let a = 10
let b = 10
a != b // false
> (Greater than operator)
- a >b → a의 값이 b보다 크다면 true를 반환한다.
- 문자열을 비교할때는 아스키 코드값으로 비교한다.
let a = 20
let b = 10
a > b // true
let a = 10
let b = 20
a > b // false
< (Less than operator)
- a < b → a의 값이 b보다 작다면 true를 반환한다.
- 문자열을 비교할때는 아스키 코드값으로 비교한다.
let a = 10
let b = 20
a < b // true
let a = 20
let b = 10
a < b // false
>= (Greater than or equal to operator)
- a >= b → a에 저장된 값이 b보다 크거나 같다면 true를 반환한다.
let a = 20
let b = 10
a >= b // true
let a = 20
let b = 20
a >= b // true
<= (Less than or equal to operator)
- a <= b → a에 저장된 값이 b보다 작거나 같다면 true를 반환한다.
let a = 10
let b = 20
a <= b // true
let a = 20
let b = 20
a <= b // true
논리 연산자(Logical Operator)
- 참과 거짓을 구분하는 연산자이다.
- 피연산자가 Boolean 표현식이다.
- 스위프트는 C기반 언어에서 3가지 표준 논리 연산자를 지원한다.
- 종류
- ! (NOT)
- && (AND)
- || (OR)
! (NOT operator)
- 참은 거짓으로 바꾸고 거짓은 참으로 바꾼다.
let vaild = true
print(!vaild) // false
// 만약 비교연산의 결과값을 반전하고싶다면 괄호로 묶어주고 NOT 연산자를 사용해야한다.
let a = 10
let b = 20
if !(a < b) { }
&& (ANd operator)
- 둘다 참일때만 참을 리턴하고 하나라도 거짓이면 거짓을 리턴한다.
- true && true = true
- true && false = false
- false && true = false
- false && false = false
|| (OR operator)
- 둘다 참일때는 참, 거짓일때는 거짓을 리턴하고 하나라도 참이면 참을 리턴한다.
- true || true = true
- true || false = true
- false || true = true
- false || false = false
3항 연산자 (Ternary Confitional Operator)
- 피연산자가 3개인 연산자를 말한다.
- 어떠한 조건에따라 두개의 값중 하나를 선택해야 하는 경우에 사용한다.
- 첫번째 피연산자는 항상 불린 표현식이 와야한다.
// 기본 문법
confition ? expr1 : expr2
let a = 10
a < 5 ? "O" : "X" // X
let b = 20
a < b ? "O" : "X" // O
// 코드가 복잡해지기때문에 선택할 수 있는 값이 2개 이상일때에는 잘 사용하지 않는다.
if else문 3항 연산자로 바꾸기
if else문
var num1 = 10
var num2 = 20
var nums = 0
if num1 > num2 {
nums = num1
} else {
nums = num2
}
print(nums) // 20
3항 연산자
var num1 = 10
var num2 = 20
var nums = 0
nums = num1 > num2 ? num1 : num2
print(nums) // 20
단락 평가(Short-circuit Evaluation)
- 논리식에서 결과를 도출하기위해 최소한의 코드만 실행된다.
- false &&
- 첫번째 피연산자가 false면 두번째 피연산자의 결과에 관계없이 항상 false가 반환된다.
- Logical AND operator (&&)
- true && true = true
- true && false = false ←
- false && true = false ←
- false && false = false ←
let a = 10
let b = 20
a == b && a != b // false
// a == b의 결과값이 false이기 때문에 a != b의 결과와 상관없이 false가 반환된다.
- ture ||
- 첫번째 피연산자가 true이면 두번째 피연산자의 결과에 관계없이 항상 true가 반환된다.
- Logical OR operator (||)
- true || true = true ←
- true || false = true ←
- false || true = true ←
- false || false = false
let a = 10
let b = 20
a != b || a == b // true
// a != b의 결과값이 true이기 때문에 a == b의 결과와 상관없이 true가 반환된다.
Side Effect
- 표현식을 평가했을때 값이 변경되는 것을 말한다.
- 저장된 데이터의 값에 변화가 생겼을 경우를 말한다.
var a = 0
var b = 0
a += 1 // Side Effect 발생!
b += 1 // Side Effect 발생!
a // 1
b // 1
만약 단락 평가와 사이드 이팩트가 동시에 발생하게 한다면 주의해서 코드를 작성해야한다.
var a = 0
var b = 0
func updateA() -> Bool {
a += 1
return true
}
func updateB() -> Bool {
b += 1
return true
}
if updateA() || updateB() {
print(a) // 1
print(b) // 0
}
위 코드에서 updateA, updateB 함수에서 분명 a와 b의 값을 증가시켰다.
하지만 print(a)와 print(b)의 결과값을보면 a는 1이고 b는 0으로 출력된다.
b의 결과값이 0인 이유는 updateA || updateB의 단락평가에서 updateA의 결과값이 true이기 때문에 updateB는 실행되지 않고 종료되기때문에 b의 결과값이 0이다.
이렇게 논리연산자를 사용할때 단락평가가 발생하게되고, 사이드 이팩트가 발생하는 경우를 주의해야한다.
할당 연산자(Assignment Operator)
- 값을 저장하는 역할을 수행한다.
- 할당 연산자를 기준으로 왼쪽에 있으면 Lvalue
- Lvalue는 메모리 공간을 의미한다.
- 할당 연산자를 기준으로 오른쪽에 있으면 Rvalue
- Rvalue는 저장할 값을 의미한다.
var a = 10
var b = a // Lvalue인 a를 Rvalue로 사용 가능
10 = a // 반대로 Rvalue를 Lvalue로는 사용할 수 없다.
if a = 10 { // error!! 할당연산자는 값을 반환하지 않기때문에 if문에서 사용 불가
}
복합 할당 연산자(Addition Assignment Operator)
- 종류
- +=
- 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 &= b → a = a & b
- |=
- a |= b → a = a | b
- ^=
- a ^= b → a = a ^ b
- <<=
- a <<= b → a = a << b
- >>=
- a >>= b → a = a >> b
- +=
범위 연산자 (Range Operator)
- 값의 범위를 간단하게 표현하는 연산자이다.
var numbers = 1...4
// ... 범위 연산자
// 1...4 1부터 4까지 (1,2,3,4)
// 1은 하한값 (첫번째 요소)
// 4는 상한값 (마지막 요소)
- for문에서 반복 범위를 지정할때 주로 사용한다.
- 종류
- Closed Range Operator
- One-Side Ranges Operator
- Half-Open Ranges Operator
Closed Range Operator
- 시작과 끝을 지정해서 사용한다.
for numbar in 1...4 {
print(number)
}
// 결과 출력
// 1
// 2
// 3
// 4
One-Side Ranges
- 범위의 시작 또는 끝만 지정해서 사용한다.
var list = [1,2,3,4,5,6,7,8,9,10]
for i in list[4...] {
print(i) // 5,6,7,8,9,10
}
for i in list[...4] {
print(i) // 1,2,3,4,5
}
Half-Open Ranges Operator
- a 부터 b보다 작을때까지 범위를 같는다.
for number in 1..<4 {
print(number)
}
// 출력결과
// 1
// 2
// 3
'Swift > Swift문법' 카테고리의 다른 글
| Swift문법 - Loop Statements (0) | 2022.12.23 |
|---|---|
| Swift문법 - Conditional Statements(if, switch, guard) (0) | 2022.12.10 |
| Swift문법 - Type Alias (0) | 2022.11.20 |
| Swift문법 - Type Conversion (0) | 2022.11.13 |
| Swift문법 - Type Inference and Type Annotation (0) | 2022.10.09 |