스위프트에서 숫자 리터럴을 표기하는 방법
var num: Int = 25
각 진법의 수도 직접 써 넣는것도 가능
num = 0b0011001 // 2진법
num = 0o31 // 8진법
num = 0x19 // 16진법
-큰 숫자는 읽기 쉽게 언더바를 붙이는 것도 가능
num = 10_000_000
num = 10_0000_0000
MemoryLayout.size // 1바이트 [메모리 공간을 얼마나 차지하는지 알 수 있는 키워드]
MemoryLayout.size // 8바이트
Int.max // (2^63승 -1) 왜 63승? : 부호 자리 수로 한 자리를 차지하기 때문!
Int.min // (-2^63승) 왜 양수는 -1을 포함? : 0을 포함하기 때문!
&+ : 오버플로우 더하기 연산자
var a = UInt8.max // 현재 변수 a에 UInt 타입의 최대값 255가 들어있음
a = a &+ 1 // 오버플로우 더하기 연산자로 1을 더해줌 -> 최소값 0으로 이동
&- : 오버플로우 빼기 연산자
var a = UInt8.min // 현재 변수 a에 UInt 타입의 최소값 0이 들어있음
a = a &- 1 // 오버플로우 더하기 연산자로 1을 빼줌 -> 최댓값 255으로 이동
& * : 오버플로우 곱하기 연산자
var a = Int8.max // 현재 변수 a에 Int8타입의 최대값이 들어있음(127)
a = a & * 2 // 오버플로우 곱하기 연산자로 2 곱하기 -> 바로 한칸씩 이동 : 2진법 형태로 생각
a = 0b01111111 &* 2
// 1) Logical NOT Operator
!true
!false
// 2) Logical AND Operator (엔드, 그리고)
true && true
true && false
false && true // false 확인하면 뒤는 확인 x
false && false // false 확인하면 뒤는 확인 x
// 3) Logical OR Operator
true || true // true만 확인하면 뒤는 확인 x
true || false // true만 확인하면 뒤는 확인 x
false || true
false || false
스위프트의 논리 평가식은 "단락 평가" 방식을 사용
논리연산식에서 결과 도출에 필요한 최소한의 논리식만 평가
논리연산자 우선순위 1) && 2) ||
⭐️참고 사이드이펙트 : 함수가 내부의 변수값만 변화시키는게 아닌 외부의 변수를 변화시키는 것을 의미
var num // checking() 을 실행할 때마다 외부 변수 num이 1씩 증가 -> ⭐️사이드 이펙트
func checking() -> Bool { // 단락 평가
print(#function)
num += 1
return true
}
if문의 조건식에서 함수를 호출하는 경우
if checking() || checking() {
}
num // 1이 나옴! why? 뒤에 있는 checking은 실행시키지 않고 평가하기 때문!
if checking() && checking() {
}
num // 2가 나옴! 이것은 뒤에꺼까지 실행하기 때문!
단락 평가로 인한 주의⚠️
사이드 이펙트 발생시는 반드시 주의
논리 평가식에서 사이드 이펙트가 발생하는 경우, 단락 평가로 인해 함수 등의 실행 횟수 차이로 의도치 않은 결과가 도출될 수 있음! => 논리적인 오류가 없도록 표현식을 미리 실행하도록 코드를 수정해주어야 함
또는 변수에 논리 연산을 담은 다음 논리 연산을 구성하면, 전부 다 실행하기 때문에 오류를 방지할 수 있음