🔥 사용자 정의 연산자
강의 목차
Swift는 기본적으로 제공하는 연산자 외에도 개발자가 직접 사용자 정의 연산자
를 정의하고 구현할 수 있는 기능을 제공합니다. 사용자 정의 연산자에 사용할 수 있는 문자의 목록은 Operators에서 확인할 수 있어요.
operator
키워드를 사용하여 새로운 연산자를 전역 수준에서 선언하고, prefix
, infix
또는 postfix
한정자로 표시합니다.
prefix operator +++
swift
위의 예제는 +++
라는 새로운 전위 연산자를 정의합니다. 이 연산자는 Swift에서 기존에 존재하는 의미가 없기 때문에, Vector2D
인스턴스를 다루는 특정 상황에서 고유한 의미를 부여받습니다. 이 예제에서 +++
는 "전위 두 배 증가" 연산자로 취급되며, Vector2D
인스턴스의 x
와 y
값을 두 배로 만듭니다. 이는 앞서 정의한 덧셈 할당 연산자를 사용하여 벡터를 자기 자신에 더함으로써 구현합니다. +++
연산자를 구현하기 위해 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을 참조하세요.
사용자 정의 연산자를 활용하면 코드의 가독성과 표현력을 높일 수 있습니다. 상황에 맞는 적절한 연산자를 정의하고 사용하면 코드의 의도를 더 명확하게 전달할 수 있게 되죠. 하지만 연산자를 남용하면 오히려 코드를 이해하기 어려워질 수 있으니 주의해야 합니다. 사용자 정의 연산자는 신중하게 사용하되, 필요한 경우 적극 활용하는 것이 좋겠네요!