Swift랑 친해지기/Swift문법정리

[Swift] 연산자 (Operator)

데브킹덕 2022. 7. 28. 14:06

연산

- 주어진 식을 계산하여 결과를 얻어내는 과정 

 

연산자 (operator)

- 연산을 수행하는 기호

 

피연산자 (operand)

- 연산의 대상

 

a + b 
a, b // 피연산자
+ // 연산자

 

연산자 종류

연산자의 위치에 따라

피연산자 수에 따라

역할과 기능에 따라

 

1. 연산자의 위치에 따라

- 전치 연산자 (Prefix Operator)

+ a

- 후치연산자 (Postfix Operator)

a +

-  중위연산자 (Infix Operator)

a + b

 

 

 

2. 피연산자의 개수로 나눌때

- 단항연산자(Unary Operator)

- 이항연산자(Binary Operator)

- 삼항연산자(Ternary Operator)

 

단항연산자(Unary Operator)

 

+ a

 

이항연산자(Binary Operator)

a + b

 

삼항연산자(Ternary Operator)

a ? b : c

 

연산시 생각해두기

연산을 처리할때 Left Associative(좌결합 형식)을 띔 

 

3 - 2 - 1 

--------> 좌결합성

Left Associative

 

 

연산을 할때 우선순위(Precedence)를 주고 싶을때는 ( ) parentheses (소괄호)를 사용

a + b * c
// 곱셈을 먼저 연산하기 때문에 a + (b * c)과 같음

a + b 를 먼저 처리하고 싶다면? 

(a + b) * c
//소괄호를 이용해 연산 우선순위를 줄 수 있음

 

3. 역할에 따른 연산자 구분

산술연산자

비교연산자

논리연산자

비트연산자

 

3-1.산술연산자

사칙 연산하는 연산자 

1. Unary Plus Operator (단항 더하기 연산자)

- + 와 상수를 띄어쓰면 안됨

+a

 

2. Addition Operator (더하기 연산자)

a + b

3. Unary Minus Operator (단항 빼기 연산자)

- 양수 -> 음수

- 음수 -> 양수

-a

4. Subtraction Operator (빼기 연산자)

a - b

5. Division Operator(나누기 연산자)

- a에서 b를 나눈 몫

- 정수에서는 0또는 양의정수를 반환함

- 실수에서는 소숫점 자리까지 몫을 반환

 

a / b

 

6. Remainder Operator(나머지 연산자)

- 정수를 연산할때 나머지는 정수

- 실수를 연산할때 아래와 같이 에러남

truncatingRemainder메소드가 필요함 

 

a % b

정수 나머지 연산
truncatingRemainder를 이용한 실수 나머지 연산

 

 

OverFlow 오버플로우

- 연산시 저장범위를 벗어날때 오버플로우현상이 일어남

- Swift에서는 오버플로우를 허용하지 않으며 오버플로우 연산자를 지원함

- C언어 기반에서는 objective-c 포함 Overflow를 허용

 

메모리 공간에 적당한 값이 저장되었을 경우

 

- UInt8은 1byte로 overflowNum1 상수는 메모리공간에 값이 저장될 수 있음

메모리 저장공간의 범위를 벗어나 Overflow 발생

- overflowNum2는 729라는 값으로 UInt8에 메모리 저장공간의 범위보다 더 커 오버플로우가 발생

- 컴파일 타임에 에러를 발견할 수 있지만 모든 오버플로우를 발견하는 것은 아님

- 해결방법: UInt8 보다 큰 자료형을 사용하거나 오버플로우 연산자를 사용

메모리 공간에 알맞은 자료형 사용한 경우

 

 

오버플로우 연산자 

 

1. Overflow Addition Operator (오버플로우 덧셈 연산자)

a &+ b

오버플로우 덧셈 연산자 사용

근데 왜 b의 값이 128이 아닌 -128일까?

 

메모리에는 이렇게 비트를 저장할 수 있는 공간이 있다.

 

이때 상수 a를 선언할때 초록색만큼의 저장공간을 확보한다

 

 

이때 UInt가 아닌 Int로 부호비트를 사용한다.

127 -> 0 1 1 1 1 1 1 1 1

+1

-128 -> 1 0 0 0 0 0 0 0

나머지 데이터 비트를 2의 보수로 역산해서 10진수로 바꾸면 - 128이 됨

 

2. Overflow Subtraction Operator (오버플로우 뺄셈 연산자)

a &- b

오버 플로우 뺄셈 연산자

 

 

3. Overflow Multiplication Operator (오버플로우 곱셈 연산자)

a &* b

 

오버플로우 곱셈 연산자

 

 

 

 

연산 중 오버플로우 연산자를 사용할때 결과

이처럼 오버플로우 연산이 허용된다고 해서 -128에서 -1을 한다고 해서 -129가 되지는 않음 

127도 +1을 한다고 해서 128이 안됨

만약 128이 된다면 1bit가 늘어나야 되고 

Int8 메모리 자료가 늘어나야되는데 허용되지 않음

메모리 공간을 늘지 않고 비트가 바뀔뿐임

 

 

 

3-2.비교 연산자(Comparison Operators)

두개의 이항연산자 값을 비교

-true, false 두개의 결과만 나옴

 

Equal to Operator (값이 같은지 비교하는 연산자)

- 피연산자의 자료형을 같게 해야 함 

- 문자열도 비교가 가능함 (Swift에서는 대소문자를 구별을 철저히 함, 아스키코드 / 유니코드로 판단)

 

a == b

자료형이 같은 상수 비교연산자를 이용해 비교
문자열 비교연산자를 이용해 비교
피연산자의 자료형이 다를때 에러발생

Not Equal to Operator (값이 같지 않은지 비교하는 연산자)

a != b

Not Equal to Operator를 이용해 비교

Greater than Operator (a가 b보다 값이 큰지 비교할때  사용하는연산자)

a > b

a가 b보다 값이 큰지 비교할때  사용하는연산자

 

Greater than or Equal to Operator (a가 b보다 값이 큰거나 같을때 사용하는연산자)

a >= b

a가 b보다 값이 큰거나 같을때 사용하는연산자

Less than Operator (a가 b보다 값이 작은지 비교할때  사용하는연산자)

a < b

a가 b보다 값이 작은지 비교할때&nbsp; 사용하는연산자

Less than or Equal to Operator (a가 b보다 값이 작은지 비교할때  사용하는연산자)

a <= b

가 b보다 값이 작은지 비교할때&nbsp; 사용하는연산자)

3-3) 논리연산자 (Logical Operators)

모든 피연산자, 결과 boolean형식

1. Logical NOT Operators (논리 부정 연산자)

거짓 -> 참

참 -> 거짓

!a

논리 부정 연산자를 이용한 연산

!가 우선순위가 높아 먼저 실행하여 피연산자인 num1을 부정해야 하는데 boolean형식이 아닌 정수라 컴파일 에러남

 

해결방법: 결과 표현할 식을 () 소괄호로 감싸주자

 

소괄호 ()를 이용하여 에러 해결

2. Logical AND Operators (AND 연산자)

- a와 b 모두 boolean형식이어야 함

- a,b 가 모두 참이어야 참 

- 나머지 거짓

a && b

AND연산자를 이용하여 연산

 

 

3. Logical OR Operators (OR 연산자)

- a와 b 모두 boolean형식이어야 함

- a,b 가 모두 거짓이어야 거짓  (하나만 참이어도 참)

- 나머지 참

a || b

OR연산자를 이용하여 연산

 

삼항연산자(Ternary Conditional Operators)

- 어떤 조건에서 하나를 선택할때 사용

- 코드가 복잡해져서 두가지 중 선택할때만 사용

Condition(Boolean표현식) ? expr1(True일때) : expr2(False일때)

삼항연산자

두개보다 많은 조건을 따지는 삼항연산자는 가독성이 좋지 않아 if문이나 switch문 사용하는게 좋음

 

3-4) 비트연산자 (Bitwise Operators)

bit가 0이면 False 1이면 True

장점

- 연산속도가 빠름 

- 짧은 코드로 복잡한 로직짤때 유용

 

사용처

- 비트플래그를 활용해 옵션을 저장할때

- 암호화

- 하드웨어 드라이버를 만들때

- 임베디드프로그램을 만들때

- 그래픽 처리를 할때

 

1. Bitwise NOT Operator 

0 -> 1

1 -> 0  

EX)

     0 0 1 0 0 0 1 1 

-> 1 1 0 1 1 1 0 0 

~a

Bitwise NOT Operator 예제

2. Bitwise AND Operator 

- 모든 비트가 1일때 1이고 나머지는 0 

- 1을 True로 생각하면 쉬움

a & b

 

Bitwise AND Operator 예제

3. Bitwise OR Operator

- 모든 비트가 0일때 0이고 나머지는 1

a | b

 

Bitwise OR Operator 예제

4. Bitwise XOR Operator

- 두 비트가 달라야지만 1

a ^ b

Bitwise XOR Operator 예제

5.Bitwise Left Shift Operator

- 메모리에 저장된 비트를 왼쪽으로 이동시킴

- n만큼 이동하고 앞에 밀려서 없어진 비트는 사라지고 뒤에 생기는 비트는 0 

- n이 1씩 늘어날때마다 2배씩 늘어남

a << n

Bitwise Left Shift Operator 예제

값은 같지만 비트를 다루기 때문에 비트연산자가 더 빠름

하지만 *연산자도 빠르기때문에 가독성이 좋은 곱하기 연산자를 사용함 

 

 

6.Bitwise Right Shift Operator

- 메모리에 저장된 비트를 오른 쪽으로 이동시킴

- n만큼 이동하고 앞에 밀려서 생기는 비트는 0 뒤에 없어지는 비트는 사라짐 

- n이 1씩 늘어날때마다 2배씩 줄어듦 (이때 몫만 나타남)

a >> b

Bitwise Right Shift Operator 예제

7.Arithmetic Shift

- 위에 Shift들은 Unsigned 자료형이고 Signed 자료형일때 사용

- 기존에 있던 Sign Bit가 자리하며 n만큼 오른쪽으로 이동 

      0 0 1 0 0 0 1 1

-> 0 0 0 1 0 0 0 1

a >> b

 

3-5) 범위연산자 (Range Operator)

1. Closed Range Operator

 

- 오름차순표현

- upperBound가 범위에 포함됨

*lowerBound  - 시작범위

*upperBound - 종료범위

- 실수도 가능 

- For loop문에서는 upperBound를 지정해주지 않으면 메모리고갈될때까지 실행함(조심)

ex) for i in 1...{

        }

단항연산자경우
a...
...a

이항연산자경우
a ... b

Closed Range Operator 정수예시
Closed Range Operator 실수예시
오름차순 표현을 사용해야함
단항 연산자경우

 

2. Half -Open Range Operator

- 범위에 포함되지 않음

- 단항연산자는 Postfix만 가능

- 배열은 범위가 고정되어 있어 단항연산자사용 가능

a ..< b
..<a

Half -Open Range Operator

단항연산자 사용시

lowerBound를 설정해주지 않을 경우
배열에서 Half Open Range Operator 사용시