🔥 사용자 정의 연산자

406자
5분

Swift는 기본적으로 제공하는 연산자 외에도 개발자가 직접 사용자 정의 연산자를 정의하고 구현할 수 있는 기능을 제공합니다. 사용자 정의 연산자에 사용할 수 있는 문자의 목록은 Operators에서 확인할 수 있어요.

operator 키워드를 사용하여 새로운 연산자를 전역 수준에서 선언하고, prefix, infix 또는 postfix 한정자로 표시합니다.

prefix operator +++
swift

위의 예제는 +++라는 새로운 전위 연산자를 정의합니다. 이 연산자는 Swift에서 기존에 존재하는 의미가 없기 때문에, Vector2D 인스턴스를 다루는 특정 상황에서 고유한 의미를 부여받습니다. 이 예제에서 +++는 "전위 두 배 증가" 연산자로 취급되며, Vector2D 인스턴스의 xy 값을 두 배로 만듭니다. 이는 앞서 정의한 덧셈 할당 연산자를 사용하여 벡터를 자기 자신에 더함으로써 구현합니다. +++ 연산자를 구현하기 위해 Vector2D+++라는 이름의 타입 메서드를 추가해봅시다:

extension Vector2D {
    static prefix func +++ (vector: inout Vector2D) -> Vector2D {
        vector += vector
        return vector
    }
}
 
var toBeDoubled = Vector2D(x: 1.0, y: 4.0)
let afterDoubling = +++toBeDoubled
// toBeDoubled의 값은 이제 (2.0, 8.0)입니다.
// afterDoubling의 값도 (2.0, 8.0)입니다.
swift

사용자 정의 중위 연산자의 우선순위

사용자 정의 중위 연산자는 각각 우선순위 그룹에 속합니다. 우선순위 그룹은 다른 중위 연산자와 비교했을 때 연산자의 우선순위와 결합성을 지정합니다. 이러한 특성이 중위 연산자와 다른 중위 연산자의 상호 작용에 어떤 영향을 미치는지에 대한 설명은 Precedence and Associativity에서 확인할 수 있어요.

우선순위 그룹에 명시적으로 배치하지 않은 사용자 정의 중위 연산자는 삼항 조건 연산자의 우선순위보다 바로 한 단계 높은 기본 우선순위 그룹을 부여받습니다.

다음 예제는 AdditionPrecedence 우선순위 그룹에 속하는 +-라는 새로운 사용자 정의 중위 연산자를 정의합니다:

infix operator +-: AdditionPrecedence
extension Vector2D {
    static func +- (left: Vector2D, right: Vector2D) -> Vector2D {
        return Vector2D(x: left.x + right.x, y: left.y - right.y)
    }
}
let firstVector = Vector2D(x: 1.0, y: 2.0)
let secondVector = Vector2D(x: 3.0, y: 4.0)
let plusMinusVector = firstVector +- secondVector
// plusMinusVector는 (4.0, -2.0)의 값을 가진 Vector2D 인스턴스입니다.
swift

이 연산자는 두 벡터의 x 값을 더하고, 첫 번째 벡터의 y 값에서 두 번째 벡터의 y 값을 뺍니다. 본질적으로 "덧셈" 연산자이기 때문에 +-와 같은 덧셈 중위 연산자와 동일한 우선순위 그룹을 부여받았어요. Swift 표준 라이브러리에서 제공하는 연산자에 대한 정보와 연산자 우선순위 그룹 및 결합성 설정의 전체 목록은 Operator Declarations에서 확인할 수 있습니다. 우선순위 그룹에 대한 자세한 내용과 고유한 연산자 및 우선순위 그룹을 정의하는 구문을 보려면 Operator Declaration을 참조하세요.

사용자 정의 연산자를 활용하면 코드의 가독성과 표현력을 높일 수 있습니다. 상황에 맞는 적절한 연산자를 정의하고 사용하면 코드의 의도를 더 명확하게 전달할 수 있게 되죠. 하지만 연산자를 남용하면 오히려 코드를 이해하기 어려워질 수 있으니 주의해야 합니다. 사용자 정의 연산자는 신중하게 사용하되, 필요한 경우 적극 활용하는 것이 좋겠네요!