본문 바로가기
FRONT-END/iOS

Swift 고급연산자

by 랄라J 2023. 8. 29.

숫자 리터럴

Swift는 숫자를 표기할 때 추가적으로 알아두면 좋은 몇가지 포인트들이 있다.

1. 2진법/8진법/16진법으로 직접 써 넣을 수 있다

2. 큰 숫자를 읽기 쉽게 하기위해 언더바(_)를 사용해도 된다

var num:Int = 0

num = 0b00011010
num = 0o31
num = 0x19

num = 1_000_000

 

또한, Swift에서는 Int/UInt 타입을 저장할 때 플랫폼 사양에 따라 다르지만 최근에는 64bit -> 8byte로 저장된다. 이는 Int64 / UInt64로 표기된다. 이를 확인하기 위해 MemoryLayout<Int64>.size를 입력하면 메모리를 얼마나 사용하는지 알려준다.

 

오버플로우

오버플로우라는 개념은 값이 넘침을 의미한다. 예를들어 8비트를 담을 수 있는 공간에 255를 넘어가는 숫자가 담기는 것을 말할 수 있다. C언어와 Objective-C에서는 이런 오버플로우 현상을 허락했지만 Swift에서는 허락하지 않아 위와 같은 현상 발생 시 에러가 발생하게된다. 이를 구현해야하는 특정한 경우를 위해 Swift는 오버플로우 연산자를 마련했다. 연산자 앞에 &(앰퍼센드) 기호를 붙여 &+, &-, &*로 사용된다. 앱을 만들 때보다는 게임 개발 등에 사용되니 부담가지지 말고 알아만 놓으면 되는 개념이다. 

 

논리 연산자 단락평가

Swift의 논리 연산자는 단락평가 방식을 사용한다. 단락평가 방식이란 논리 평가식에서 결과 도출에 필요한 최소한의 논리식만 평가한다는 것을 의미한다. 참고로 논리 연산자도 우선순위가 있다. && 먼저 || 나중이다.

false && true // false만 확인
true || false // true만 확인

단락 평가로 인해 사이드 이펙트(함수 내에서 일부 외부 변수의 값을 변경시키는 것)이 발생하는 경우, 함수의 실행 횟수가 예상대로 실행되지 않는 경우가 발생할 수 있어 의도치 않은 결과가 발생할 수 있으니 주의가 필요하다.

 

비트 연산자

메모리 비트 단위로 직접적인 논리연산을 하거나, 비트 단위 이동시에 사용하는 연산자를 의미한다. 주로 하드웨어적인 처리나 그래픽 프로그래밍, 임베디드프로그래밍, 암호화처리, 게임 등에 한정적으로 사용된다.

비트 논리 연산자

  • ~ : Bitwise NOT operator, 비트 반전
  • & : Bitwise AND operator, 모두가 1이면 1반환
  • | : Bitwise OR operator, 하나라도 1이면 1반환
  • ^ : Bitwise XOR operator, 서로 다르면 1반환

비트 이동 연산자

  • >> : Bitwise Left Shift operator, 왼쪽으로 이동, 2배 효과
  • << : Bitwise Right Shift operator, 오른쪽으로 이동, 나누기 2 효과

 

연산자 메서드 구현

연산자도 내부적으로 구현이 되어있는 타입 메서드이다. 

static func + (lhs: Int, rhs: Int) -> Int {
    // return
}

static prefix func - (name: Int) -> Int {
    // return 
}

static func +- (lhs: inout Int, rhs: Int) -> Int {
    // return 
}

이항 infix(중위 연산자)의 경우 키워드를 생략해서 사용한다. 단항으로 쓰이는 prefix, postfix 연산자의 경우 func 키워드 앞에 prefix, postfix 키워드를 써야한다.

 

비교 연산자의 경우 Equatable, Comparable 프로토콜을 채택한 후 타입 메서드로 직접 구현해야한다. == 연산자를 구현하면, != 연산자는 자동구현되고 < 연산자를 구현하면 <=, >, >= 연산자가 자동 구현된다.

 

사용자 정의 연산자 구현

사용하려는 연산자를 선언 후 해당 연산자를 사용하려는 타입에서 타입메서드로 연산자 내용을 직접 구현한다.

prefix operator ++

extension Int {
    static prefix func ++ (number: inout Int) {
        return number += 1
    }
}

 

참고로 사용자 정의 연산자를 사용할 때는 직접 정의해서 연산자 우선순위그룹을 지정할 수 있다. 해당 방식은 필요 시 알아보면 좋겠다. 

반응형

댓글