연산
- 주어진 식을 계산하여 결과를 얻어내는 과정
연산자 (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
OverFlow 오버플로우
- 연산시 저장범위를 벗어날때 오버플로우현상이 일어남
- Swift에서는 오버플로우를 허용하지 않으며 오버플로우 연산자를 지원함
- C언어 기반에서는 objective-c 포함 Overflow를 허용
- UInt8은 1byte로 overflowNum1 상수는 메모리공간에 값이 저장될 수 있음
- 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
Greater than Operator (a가 b보다 값이 큰지 비교할때 사용하는연산자)
a > b
Greater than or Equal to Operator (a가 b보다 값이 큰거나 같을때 사용하는연산자)
a >= b
Less than Operator (a가 b보다 값이 작은지 비교할때 사용하는연산자)
a < b
Less than or Equal to Operator (a가 b보다 값이 작은지 비교할때 사용하는연산자)
a <= b
3-3) 논리연산자 (Logical Operators)
모든 피연산자, 결과 boolean형식
1. Logical NOT Operators (논리 부정 연산자)
거짓 -> 참
참 -> 거짓
!a
!가 우선순위가 높아 먼저 실행하여 피연산자인 num1을 부정해야 하는데 boolean형식이 아닌 정수라 컴파일 에러남
해결방법: 결과 표현할 식을 () 소괄호로 감싸주자
2. Logical AND Operators (AND 연산자)
- a와 b 모두 boolean형식이어야 함
- a,b 가 모두 참이어야 참
- 나머지 거짓
a && b
3. Logical OR Operators (OR 연산자)
- a와 b 모두 boolean형식이어야 함
- a,b 가 모두 거짓이어야 거짓 (하나만 참이어도 참)
- 나머지 참
a || b
삼항연산자(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
2. Bitwise AND Operator
- 모든 비트가 1일때 1이고 나머지는 0
- 1을 True로 생각하면 쉬움
a & b
3. Bitwise OR Operator
- 모든 비트가 0일때 0이고 나머지는 1
a | b
4. Bitwise XOR Operator
- 두 비트가 달라야지만 1
a ^ b
5.Bitwise Left Shift Operator
- 메모리에 저장된 비트를 왼쪽으로 이동시킴
- n만큼 이동하고 앞에 밀려서 없어진 비트는 사라지고 뒤에 생기는 비트는 0
- n이 1씩 늘어날때마다 2배씩 늘어남
a << n
값은 같지만 비트를 다루기 때문에 비트연산자가 더 빠름
하지만 *연산자도 빠르기때문에 가독성이 좋은 곱하기 연산자를 사용함
6.Bitwise Right Shift Operator
- 메모리에 저장된 비트를 오른 쪽으로 이동시킴
- n만큼 이동하고 앞에 밀려서 생기는 비트는 0 뒤에 없어지는 비트는 사라짐
- n이 1씩 늘어날때마다 2배씩 줄어듦 (이때 몫만 나타남)
a >> b
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 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
2. Half -Open Range Operator
- 범위에 포함되지 않음
- 단항연산자는 Postfix만 가능
- 배열은 범위가 고정되어 있어 단항연산자사용 가능
a ..< b
..<a
단항연산자 사용시
'Swift랑 친해지기 > Swift문법정리' 카테고리의 다른 글
[Swift] 제어전달문 (break, continue) (0) | 2022.08.01 |
---|---|
(Swift) 반복문 (0) | 2022.07.29 |
[Swift] 단락평가 (Short-circuit Evaluation) (0) | 2022.07.27 |
[Swift] Type Inference, Type Annotation, Type Conversion, Type Alias (0) | 2022.07.25 |
[Swift] 숫자 리터럴 (Number Literals) (0) | 2022.07.25 |