iyOmSd/Title: Swift

[Swift] 커스텀 연산자 만들기 (Custom Operator)

냄수 2020. 12. 31. 22:11
반응형

+ 와 - 같은 연산자들을 직접 만들어 사용해 볼 거에요

 

infix: 사이에 연산자가 있는경우 ( 3 + 3 )

prefix: 앞에 연산자가 있는경우 ( ++3 )

postfix: 뒤에 연산자가 있는경우 ( 3++ )

 

이 3가지중 하나를 골라서 먼저 정의를 해줘야해요

postfix operator ====

그리고 연산자에서 중요한게 우선순위가 있어요

+와 *가 같이있다면 *부터 계산되는 그런 우선순위와 (서로다른 우선순위간의 계산)

같은순위의 연산자 -, + 사이에는 어느것 부터 계산되어야하는지도 중요하죠 (같은 우선순위간의 계산)

 

precedencegroup 이라는 키워드를 이용해서 우선순위를 만들어 줄 수 있어요

 

옵션에는

associativity: 우선순위가 같은 연산자들의 처리 방식으로 left/right중 선택

higherThan: 보다 우선순위가 높다

lowerThan: 보다 우선순위가 낮다

 

~Than에는 옵션들이 여러개 있어요 대표적으로 

TernaryPrecedence: 삼항연산자 우선순위

AdditionPrecedence: 덧셈 우선순위

MultiplicationPrecedence: 곱셈 우선순위

가 잇어요

 

예를들어

higherThan: AdditionPrecedence

이렇게 정의했다면 이 연산자는 덧셈 우선순위보다 높은거에요

덧셈보다 먼저 실행되는 연산자죠

 

그다음에 해당하는 연산자에 대한 실행할 로직을 함수로 만들어 주면돼요

infix 연산자는 함수앞에 키워드가 안붙지만

다른것들은 붙여야하구요

 

/// associativity: 우선순위가 같은 연산자들의 처리 방식, left/right중 선택
/// precedencegroup: 우선순위
/// higherThan: AdditionPrecedence 덧셈
/// higherThan: MultiplicationPrecedence 곱셈
/// lowerThan: 보다 우선순위낮게
precedencegroup CustomPrecedence {
    associativity: left
    higherThan: TernaryPrecedence // 삼항 연산자
    
}
postfix operator ====
prefix operator !!!!
infix operator ++++: CustomPrecedence

func ++++(lhs: Int, rhs: Int) -> Int {
    return lhs * 2 + rhs * 2
}

prefix func !!!!(rhs: Int) -> Int {
    return rhs * rhs
}

postfix func ====(lhs: Int) -> Int {
    lhs * lhs
}

print(2++++4)
print(!!!!3)
print(4====)

/* Print
12
9
16
*/

잘 동작하는 것을 볼 수 있어요

 

복잡한 계산들을 미리 정의해두어서 연산자로 간단하게 사용할 때 편리할 것 같네요

반응형