Development/Swift

[Swift]Swift가 제공하는 연산자들 - Operators in Swift (1)

morijwana 2020. 7. 15. 14:28

산술 연산자 - Arithmetic Operators

Swift는 데이터 타입에 굉장히 민감한 언어이므로, 연산이 이루어지기 전에 두 피연산자의 데이터 타입 통일이 이루어져야 한다.(형식 안전성 - Type Safety)

산술 연산자 설명 사용 예시
+ 덧셈 a + b
- 뺄셈 a - b
/ 나눗셈 a / b
% 나머지(정수 간 연산만 가능) a % b

실수 간의 나머지 연산은 truncatingRemainder() 메소드를 사용해야 한다.

let c = 12.0
let d = 5.0
c.truncatingRemainder(dividingBy: d)  // 2

 

오버플로우 연산자 - Overflow Operators

다른 C 계열 언어와는 다르게, Swift에서는 오버플로우를 에러로 판단한다.
예를 들어, C에서는 char num = 127; num++; 에서 덧셈 연산 이후 num의 값은 -128이 되지만, Swift에서는 이것을 에러로 보고 컴파일하지 않는다.

하지만 문제 해결 과정에서 오버플로우를 일부러 일으키는 경우도 빈번히 있기 때문에, Swift에서도 오버플로우 연산자를 통해 오버플로우를 발생시킬 수 있다.

Swift의 오버플로우 연산자는 총 3가지(오버플로우 덧셈 연산자, 오버플로우 뺄셈 연산자, 오버플로우 곱셈 연산자)다.
사용법은 간단하게도 나눗셈과 나머지 연산자를 제외한 산술 연산자 앞에 &(앰퍼샌드)를 붙여주기만 하면 된다.

  • 오버플로우 덧셈 연산자 👉🏻 a &+ b
    let a: Int8 = Int8.max  // 127
    // let b: Int8 = a + 1  --> error(overflow)
    let b: Int8 = a &+ 1    // -128
  • 오버플로우 뺄셈 연산자 👉🏻 a &- b
    let c: Int8 = Int8.min  // -128
    // let d: Int8 = a - 1  --> error(overflow)
    let d: Int8 = a &- 1    // 127
  • 오버플로우 곱셈 연산자 👉🏻 a &* b
    let e: Int8 = Int8.max &* 2  // -2

    Int8.max * 2 = 127 * 2 = 254

    0 -> ... -> 127 -> -128 -> -127 -> ... -> -2

 

비교 연산자 - Comparison Operators

비교 후 참인 경우 true, 거짓인 경우 false를 리턴함. 문자열 비교도 가능하다.
비교하는 두 피연산자의 자료형이 같아야 한다.

비교 연산자 설명 사용 예시
> a가 b를 초과하는지 판단 a > b
< b가 a를 초과하는지 판단 a < b
>= a가 b 이상인지 판단 a >= b
<= b가 a 이상인지 판단 a <= b
== 두 값이 같은지 판단 a == b
!= 두 값이 다른지 판단 a != b

문자열을 비교하는 경우, 해당 문자열의 아스키 코드를 비교하여 더 큰 아스키 코드값을 가진 문자열을 크다고 판단한다.

example:
"swift" > "Swift" : true, s의 아스키 코드 값 : 115 / S의 아스키 코드 값 : 83

 

논리 연산자 - Logical Operators

논리 연산자 설명 사용 예시
! NOT 연산, Boolean 값 반전 !a, !(a > b)
&& AND 연산 a && b, (a > b) && (a > c)
|| OR 연산 a || b, (a > b) || (a > c))

&&|| 연산을 사용할 때에는 Side effect에 주의해야 한다.

예를 들어, a와 b의 값을 각각 1 증가시키고 true를 리 턴하는 함수 func1, func2가 있다고 하자.

if(func1() || func2()) {
    ...
}

에서 func1이 이미 참이므로 func2는 실행되지 않으며, 이 때 a의 값만 1 증가하고, b의 값에는 변함이 없다.

이런 경우를 방지하기 위해서는

let val1 = func1()
let val2 = func2()
if(val1 || val2) {
    ...
}

이런 식으로 두 함수의 실행을 확실히 보장하는 코드를 작성하면 된다.

 

삼항 연산자 - Ternary Conditional Operators

👉🏻 condition ? expr1 : expr2

condition의 값이 참이면 expr1을, 거짓이면 expr2를 실행한다.

func isEvenNumber(num: Int) -> Bool {
  let result = (num % 2 == 0) ? true : false
  return result
}