고급 연산자 (정수타입 / 숫자리터럴 / 오버플로우 / 단락 평가)

velog_ghost·2022년 7월 7일
1

[SeSAC] TIL📚

목록 보기
5/19

스위프트의 정수타입 / 숫자 리터럴


숫자 리터럴

  • 스위프트에서 숫자 리터럴을 표기하는 방법
    var num: Int = 25

  • 각 진법의 수도 직접 써 넣는것도 가능
    num = 0b0011001 // 2진법
    num = 0o31 // 8진법
    num = 0x19 // 16진법

-큰 숫자는 읽기 쉽게 언더바를 붙이는 것도 가능
num = 10_000_000
num = 10_0000_0000


스위프트 정수 타입

  • 플랫폼 사양에 따르는 타입 : Int, UInt (대부분 64비트)
  • 8-bit : Int8, UInt8
  • 16-bit : Int16, UInt16
  • 32-bit : Int32, UInt32
  • 64-bit : Int64, UInt64

MemoryLayout.size // 1바이트 [메모리 공간을 얼마나 차지하는지 알 수 있는 키워드]
MemoryLayout.size // 8바이트
Int.max // (2^63승 -1) 왜 63승? : 부호 자리 수로 한 자리를 차지하기 때문!
Int.min // (-2^63승) 왜 양수는 -1을 포함? : 0을 포함하기 때문!


오버플로우 개념 및 연산자


오버플로우 개념

  • 다른 언어에서는 만약 var num: UInt8 에 255가 넘어가는 숫자를 담아도 다시 0으로 순환되는 형태로 값이 넘치는 것(overflow)를 허락했지만, 스위프트에서는 오버플로우를 기본적으로 허락하지 않음 -> error 발생(크래시)
  • 특정한 경우에, 특정 패턴을 구현하기 위해 오버플로우를 허용하는 경우가 필요 -> 오버플로우 연산자 이용

오버플로우 연산자

  • &+ : 오버플로우 더하기 연산자
    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가 나옴! 이것은 뒤에꺼까지 실행하기 때문!
    
    
  • 단락 평가로 인한 주의⚠️

  • 사이드 이펙트 발생시는 반드시 주의

  • 논리 평가식에서 사이드 이펙트가 발생하는 경우, 단락 평가로 인해 함수 등의 실행 횟수 차이로 의도치 않은 결과가 도출될 수 있음! => 논리적인 오류가 없도록 표현식을 미리 실행하도록 코드를 수정해주어야 함

  • 또는 변수에 논리 연산을 담은 다음 논리 연산을 구성하면, 전부 다 실행하기 때문에 오류를 방지할 수 있음

0개의 댓글