-
Swift - Operator 종류Programming/Swift 2020. 9. 28. 16:43
오늘은 Operator의 종류에 대해서 함께 공부해보려 합니다.
바로 시작할게요!!
Arithmetic Operator
산술 연산자는 우리가 자주 사용하던 사칙연산을 생각하시면 쉽습니다.
곱하기는 *(asterisk)문자를 사용하고 나누기는 /(slash) 문자를 사용합니다.
a, b가 Int이기때문에 a / b의 결과는 나머지가 버려지고 3만 남게 됩니다.
그리고 나머지를 계산해주는 연산자도 존재합니다.
나머지를 계산해주는 연산자는 %(Percent) 기호를 사용합니다.
나머지 연산에서 주의할 점은 Floating Point는 % 연산자를 사용할 수 없습니다.
만약 Double이나 Float의 나머지를 구하고 싶다면 truncatingRemainder(dividingBy:) 메서드를 사용해야 합니다.
Overflow Operator
오버플로우 연산자는 Swift가 오버플로우 연산을 가능하게 해 줍니다.
앞에서 배운 연산자들을 이용하면 Swift에서는 오버플로우를 허용하지 않습니다.
오버플로우가 가능하게 하려면 overflow operator를 사용해야 합니다.
A에 UInt8이 저장할 수 있는 최대 숫자인 255를 저장했습니다.
그리고 + 1을 하게 되면 Overflow가 발생하게 됩니다.
UInt8이 확보한 1Byte 메모리 공간에는 256을 저장할 수 없기 때문입니다.
오버플로우 연산자인 &+을 사용하면 에러가 발생하지 않습니다. 하지만 256이 아닌 0이 저장된 것을 볼 수 있습니다.
0x1111_1111에 1을 더하게 되면 0x0000_0000이 되기 때문입니다.
이에 대해 자세한 내용은 CS에서 포스팅하도록 하겠습니다.
덧셈을 이외에
- &-
- &*
연산자도 존재합니다.
Assignment Operator
할당 연산자는 지금까지 아주 많이 사용한 연산자입니다.
할당 연산자는 값을 저장할 때 사용합니다.
= 을 기준으로 좌측에 오는 값을 LValue , 우측에 오는 값을 RValue라고 합니다.
LValue에는 메모리공간이 존재하는 값만 올 수 있습니다.
RValue에는 메모리공간이메모리 공간이 존재하는 값 또는 메모리 공간이 없는 Literal이 올 수 있습니다.
이러한 특징때문에 10 = rhs는 오류가 발생합니다.
그리고 Assignment Operator는 결과를 리턴하지 않습니다. 값을 할당할 뿐입니다.
다른 언어와 다르게 이러한 코드는 허용되지 않습니다.
Comparison Operator
비교 연산자는 두 피연산자를 비교할 때 사용합니다.
중요한 점은 비교한 결과는 true or false. 즉, Bool Type입니다.
- == (Equal to)는 피연산자가 같다면 true를 리턴합니다.
- != (Not Equal to)는 다르다면 true를 리턴합니다.
- > (Greater than)는 왼쪽 피연산자가 오른쪽 피연산자보다 크다면 true를 리턴합니다.
- < (Less than)는 왼쪽 피연산자가 오른쪽 피연산자보다 작다면 true를 리턴합니다.
- >= (Greater than or Equal to)는 왼쪽 피연산자가 오른쪽 피연산자보다 크거나 같으면 true를 리턴합니다.
- <= (Less than or Equal to)는 왼쪽 피연산자가 오른쪽 피연산자보다 작거나 같으면 true를 리턴합니다.
숫자뿐만 아니라 문자열도 비교할 수 있습니다.
Swift에서는 대소문자를 구별하기 때문에 "hello"와 "Hello"는 같지 않습니다.
크기는 H가 h보다 ASCII CODE상 숫자가 더 작으므로 "Hello"가 "hello"보다 작다고 판단합니다.
Logical Operator
논리 연산자는 피연산자에 Bool type만 올 수 있습니다.
그리고 결과도 Bool type입니다.
- ! (Logical NOT) 연산자는 Prefix Operator입니다.
- && 와 || 결과를 기억해주세요.
&&와 ||은 우리가 일상생활에서 사용하는 and와 or입니다.
&&는 모두 참이어야 결과가 참이고
||은 하나만 참이라면 결과가 참입니다.
논리 연산자를 공부할 때 주의할 점이 있습니다
바로 Short-circuit Evaluation과 Side-effect입니다.
Short-Circuit Evaluation
단락 평가는 && 이나 || 에서 앞의 expression 만으로 결과를 알 수 있다면 뒤의 expression은 평가하지 않고 넘어가는 것을 말합니다.
이미 결과가 뻔한데 뒤에 있는 expression을 평가한다면 그만큼 연산이 느려지겠죠??
첫 번째 경우 num > 10이 true입니다. 그러면 || 이기 때문에 뒤에 num <= 15의 결과가 무엇이 됐든 전체 결과는 true입니다.
이경우에는 num <= 15을 평가하지 않고 바로 true를 리턴합니다.
두 번째 경우도 num < 20이 false입니다. 그럼 &&은 뒤 표현식의 결과가 무엇이 됐든 전체 결과는 false입니다.
이 경우에는 num < 19를 평가하지 않고 바로 false를 리턴합니다.
Side-effect
저장된 데이터에 변화가 생긴다면 이를 Side-effect가 발생했다고 합니다.
단순히 num을 불러오는 것에는 변화가 생기지 않으므로 Side-effect가 발생한 것이 아닙니다.
여기서 주의해야 할 점은 단락 평가와 사이드 이펙트가 같이 발생하게 한다면 주의해야 합니다.
분명 leftNum과 rightNum을 +1씩 증가시켰습니다.
그런데 결과는 leftNum만 증가했고 rightNum은 증가하지 않았습니다. 왜 그럴까요??
updateLeftNum() || updateRightNumupdateRightNum()에서 updateLeftNum()이 true 이므로 오른쪽 표현식인 updateRightNum()는 단락 평가로 인해 실행이 안된 것입니다.
이렇게 논리 연산자를 사용할 때 Side-effect가 발생하는 코드가 존재한다면 사용에 주의해야 합니다. 컴파일 오류가 나지 않지만 논리적인 오류가 발생할 수 있습니다.
Range Operator
범위 연산자는 범위를 나타낼 때 사용합니다.
단항 연산자로도 사용이 가능하고 이항 연산자로도 사용이 가능합니다.
- ... (Closed Range Operator)는 피연산자를 포함하는 범위입니다.
- ..< (Half-open Range Operator)는 피연산자를 포함하지 않습니다.
- 오름차순이 아닌 내림차순 범위를 지정하고 싶다면 .reversed() 메서드를 사용해야 합니다.
- 단항으로 사용한다면 한쪽 범위는 해당 Type의 최댓값, 최솟값입니다.
Ternary Conditional Operator
삼항 조건 연산자는 유일한 삼항 연산자입니다.
다음과 같이 처음에 Bool Type인 조건이 오고 ? 뒤에 표현식이 두 개가 : 으로 구별됩니다.
Condition이 true 라면 expr1이 평가됩니다. false라면 expr2가 평가됩니다.
해당 코드는 time이 12보다 크다면 "PM"이고 작다면 "AM" 임을 나타냅니다.
삼항 조건 연산자는 다음에 공부할 If구문으로 대체될 수 있습니다.
이 코드는 위 삼항 연산자와 똑같은 기능을 합니다.
지금까지 알아본 연산자를 제외하고 다른 연산자들도 많습니다.
또한 우리가 연산자를 새로 만들 수도 있습니다.
참고자료
https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Loop Statements (0) 2020.09.30 Swift - Conditional Statement (if, switch, guard) (0) 2020.09.29 Swift - Operator 기본 (0) 2020.09.28 Swift - Type Safety, Type Alias, Type Conversion, Type Casting (0) 2020.09.20 Swift - Character, String, Bool Data Type (0) 2020.09.19