KWiOS
KWiOS0101
KWiOS
  • 분류 전체보기 (108)
    • Algorithm (41)
      • 이코테 (14)
      • 이코테 문제풀이 (21)
      • 프로그래머스 (6)
    • CS (1)
      • 모두를 위한 컴퓨터 과학(CS50 2019) (0)
    • iOS (15)
    • Swift (36)
      • Swift문법 (32)
      • 기타 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 6

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
KWiOS

KWiOS0101

Swift/Swift문법

Swift문법 - Operator

2022. 11. 27. 22:02

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
    'Swift/Swift문법' 카테고리의 다른 글
    • Swift문법 - Loop Statements
    • Swift문법 - Conditional Statements(if, switch, guard)
    • Swift문법 - Type Alias
    • Swift문법 - Type Conversion
    KWiOS
    KWiOS

    티스토리툴바