티스토리 뷰

Swift

[Swift] Operator (연산자)

learner._.Kio 2021. 2. 14. 23:45

목차

  • Operator Basics (연산자 기초)

  • Arithmetic Operators (산술 연산자)

  • Overflow Operators (오버플로우 연산자)

  • Comparison Operators (비교 연산자)

  • Logical Operators (논리 연산자)

  • Ternary Conditional Operator (삼항 연산자)

  • Assignment Operators (할당 연산자)

  • Range Operators (범위 연산자)





Operator Basics (연산자 기초)

  • Operator (연산자), Operand (피연산자), Whitespaces (공백)
  • Unary Operator (단항 연산자)
  • Binary Operator (이항 연산자)
  • Ternary Operator (삼항 연산자)
  • Prefix Operator (전치/전위 연산자)
  • Postfic Operator (후치/후위 연산자)
  • Infix Operator
  • Precedence (우선순위)
  • Associative (결합성)

 

Operator (연산자), Operand (피연산자), Whitespaces (공백)

a + b
// '+' = Operator(연산자)
// 'a', 'b' = Operand(피연산자)
// Whitespaces (공백)

Unary Operator (단항 연산자)

a+
// 'a+'처럼 피연산자가 1개일 때

+a  // O, ''+'연산자를 단항연산자로 쓰고 싶다면 붙여서 써야한다.
+ a // X, 연산자와 피연산자를 공백으로 분리해버리면 더 이상 단항연산자가 아니다.

Binary Operator (이항 연산자)

a + b
// 피연산자가 2개일 때

a+b      // O, but 간혹 오류가 발생할 수 있다.
a + b // O, 추천 코드
// 공백은 상관이 없다.

a +b // X
a+ b // X
// 연산자 양쪽에 공백을 동일하게 추가해야 한다.

Ternary Operator (삼항 연산자)

a ? b : c
/* 
피연산자가 3개일 때
피연산자가 4개이상인 경우는 없다.
피연산자와 연산자 양쪽에 공백을 추가해야 한다.
*/

Prefix Operator (전치/전위 연산자)

+a
// '+' = Prefix Operator (전치[=전위] 연산자)

Postfic Operator (후치/후위 연산자)

a+
// '+' = Postfic Operator (후치[=후위] 연산자)

Infix Operator

a + b
// '+' = Infix Operator

Precedence (우선순위)

a + (b * c)
// (b * c) 먼저 

(((a + b) * c) - d) * e
// 가장 안쪽에 있는 괄호부터 

a + b + c
// 계산순서[=우선순서]가 동일

a - b - c
3 - 2 - 1
// 우선순서에 따라 완전히 결과가 달라짐.

Associative (결합성)

  • Left Associative ( → 좌결합성)
  • Right Associative ( ← 우결합성)
3 - 2 - 1 // 0
// Left Associative ( → 좌결합성)

Q) Precedence(우선순위)와 Associative(결합성)을 외워야 할까?

가장 안쪽에 있는 괄호부터 진행되기에 ( ) 괄호만 있으면 Precedence(우선순위)와 Associative(결합성)을 외울 필요가 없다.





Arithmetic Operators (산술 연산자)

  • Unary Plus Operator (단항 플러스 연산자)
  • Addition Operator (덧셈 연산자)
  • Unary Minus Operator (단항 마이너스 연산자)
  • Subtraction Operator (뺄셈 연산자)
  • Multiplication Operator (곱셈 연산자)
  • Division Operator (나눗셈 연산자)
  • Remainder Operator (Modulo Operator) (나머지 연산자)
  • Overflow (오버플로우)

 

Unary Plus Operator (단항 플러스 연산자)

+a

let a = 2
let b = 7

+a // 2
+b // 7
// 현재 값을 그대로 반영, 사실 효용성이 없어 잘 사용하지 않는다.

Addition Operator (덧셈 연산자)

a + b

a + b // 9

Unary Minus Operator (단항 마이너스 연산자)

-a

-a // -2
// '-'연산자가 단항으로 쓰일 때에는 부호를 바꿔준다.

Subtraction Operator (뺄셈 연산자)

a - b

a - b // -5

Multiplication Operator (곱셈 연산자)

a * b

a * b // 14

Division Operator (나눗셈 연산자)

a / b

let a = 2
let b = 7
a / b // 0, a를 b로 나눈 몫
b / a // 3, b를 a로 나눈 몫

let c = Double(a) // 실수
let d = Double(b) // 실수

c / d // 0.2857142857142857
d / c // 3.5

Remainder Operator (Modulo Operator) (나머지 연산자)

a % b

a % b // 2, a를 b로 나눈 나머지
b % a // 11, b를 a로 나눈 나머지

c.truncatingRemainder(dividingBy: d)
// 2, 실수에서 나머지 연산을 할 때 사용하는 메소드

Overflow (오버플로우)

let num: Int8 = 9 * 9       // 81
let num: Int8 = 9 * 9 * 9   // error
// error :: Arithmetic operation '81 * 9' (on type 'Int8') results in an overflow

let num2: Int = 9 * 9 * 9   // 729




Overflow Operators (오버플로우 연산자)

  • Overflow Addition Operator
  • Overflow Subtraction Operator
  • Overflow Multiplication Operator

 

Int8.min    // -128
Int8.max    // 127

let num: Int8 = Int8.max        // 127
/*  let num: Int8 = Int8.max + 1
    error : Arithmetic operation '127+1' (on type 'Int8' results in an oveflow */

Overflow Addition Operator

a &+ b

let a: Int8 = Int8.max  // 127
//let b: Int8 = a + 1   // error
let b: Int8 = a &+ 1    // -128

Overflow Subtraction Operator

a &- b

let c: Int8 = Int8.min  // -128
let d: Int8 = c &- 1    // 127

Overflow Multiplication Operator

a &* b

let e: Int8 = Int8.max &* 2 // -2, 지금은 이해하려 하지 말자




Comparison Operators (비교 연산자)

  • Equal to Operator
  • Not equal to Operator
  • Greater than Operator
  • Greater than or equal to Operator
  • Less than Operator
  • Less than or equal to Operator

 

Equal to Operator

a == b

let a = 13
let b = 25

a == b // false

"swift" == "Swift" // false

let c = 13.25
a == c // error : 같은 자료형만 비교 가능

Not equal to Operator

a != b

let a = 13
let b = 25

a != b // ture

Greater than Operator

a > b

let a = 13
let b = 25

a > b // false
a < b // true

"swift" > "Swift" // true, 아스키코드에 의해서

Greater than or equal to Operator

a >= b

a >= b    // false
7 < 7        // false
7 <= 7    // ture

Less than Operator

a < b

a < b // true

Less than or equal to Operator

a <= b

a <= b // true




Logical Operators (논리 연산자)

  • Logical NOT Operators
  • Logical AND Operators
  • Logical OR Operators

 

Logical NOT Operators

!a

let a = 2
let b = 7

a < b            // true
!(a < b)    // false
!true            // false

Logical AND Operators

a && b

a > 1 && b % 2 == 0 // false
// a(2) > 1                     // true
// b % 2 = 1                 // false

true && true        //true, 모든 연산자가 true인 경우에만 true를 리턴한다.
true && false        //false
false && true        //false
false && false    //false

Logical OR Operators

a || b

a > 1 || b % 2 == 0 // true
// a(2) > 1                     // true
// b % 2 = 1                 // false

true || true        //true, 하나의 연산자가 true여도 true를 리턴한다.
true || false        //true
false || true        //true
false || false    //false




Ternary Conditional Operator (삼항 연산자)

codition ? expression1 : expression2

let hour = 12

hour < 12 ? "am" : "pm"
/*    hour < 12가 true일 경우 "am" 출력
         hour < 12가 false일 경우 "pm" 출력    */

if hour < 12 { "am" } 
    else { "pm" }                // pm

hour < 12 ? "am" : 14 // error - 2번째 피연산자와 3번째 피연산자의 자료형이 같아야 한다.



// hour < 10 "Good Morning"
// hour < 18 "Good Afternoon"
// "Good Evening

hour < 10 ? "Good Morning" : hour < 18 ? "Good Afternoon" : "Good Evening"
// 조건 연산자는 선택할 수 있는 값이 2개인 경우에만 사용한다. 그 이상은 코드가 위처럼 복잡해진다.




Assignment Operator (할당 연산자)

  • Assignment Operator (할당 연산자)
  • Compound Assignment Operators (복합 할당 연산자)
    • Addition Assignment Operator
    • Subtraction Assignment Operator
    • Multiplication Assignment Operator
    • Division Assignment Operator
    • Modulo Assignment Operator
    • Bitwise AND Assignment Operator
    • Bitwise OR Assignment Operator
    • Bitwise XOR Assignment Operator
    • Bitwise Left Shift Assignment Operator
    • Bitwise Right Shift Assignment Operator

 

Assignment Operator (할당 연산자)

a = b

// 할당 연산자는 값을 저장하는 역할이 전부지만 상당히 중요한 역할이다.

let a = 10    
var b = 20    
b = a                // 10

if a == 0 { }    // 실행가능, 비교 연산자는 boolean을 통해 값을 리턴한다.
if a = 0 { }    // error, 할당 연산자는 값을 리턴하지 않는다.


let a = 10    
var b = 20    
b = a    
// lvalue (letf)    // let a, let b, b
// rvalue (right)    // 10,         20,         a

Compound Assignment Operators (복합 할당 연산자)

Addition Assignment Operator

a += b

a = a + b

var a = 1
var b = 2
a = a + b    // 3

a = 1
b = 2
a += b        // 3

Subtraction Assignment Operator

a -= b

a = a - b

Multiplication Assignment Operator

a *= b

a = a * b

Division Assignment Operator

a /= b

a = a / b

Modulo Assignment Operator

a %= b

a = a % b

Bitwise AND Assignment Operator

a &= b

a = a & b

Bitwise OR Assignment Operator

a |= b

a = a | b

Bitwise XOR Assignment Operator

a ^= b

a = a ^ b

Bitwise Left Shift Assignment Operator

a <<= b

a = a << b

Bitwise Right Shift Assignment Operator

a >>= b

a = a >> b





Range Operators (범위 연산자)

  • Closed Range Operator
  • Half-Opern Range Operator

 

Closed Range Operator

a ... b

a...

...a

1 ... 20    
// 1~20까지의 범위
// lowerBound = 1, upperBound = 20

20 ... 1 // error: Can't form Range with upperBound < lowerBound
(1 ... 20).reversed() // 20~1까지의 범위

var sum = 0
for num in 1 ... 10 {
  num
  sum += num
}
print(sum)        // 55

let list = [1, 2, 3, 4, 5]
list[2...]        // [3, 4, 5]
list[...2]        // [1, 2, 3]

Half-Open Range Operator

a ..< b

..<a

1 ..< 20 // 1~19

let list = [1, 2, 3, 4, 5]
list[2<..]        // [4, 5]
list[..<2]        // [1, 2]

let range = 0 ... 20
range.contains(13)    // true
range.contains(25)    // false

let range2 = ... 20            // 단독으로 사용하면 lowBound는 무한대가 된다.
range.contains(-123)        // true
range.contains(Int.min)    // true
댓글