문법 (19) 연산자 정의 및 오버로딩 (operator)
Swift에서 연산자 정의 및 오버로딩 (operator)의 개념과 활용법을 설명합니다.
문법 (19) 연산자 정의 및 오버로딩 (operator)
연산자 정의 및 오버로딩 (operator)
Swift에서는 연산자(Operator)를 직접 정의하거나, 기존 연산자의 동작을 커스텀 타입에 맞게 변경할 수 있습니다.
이를 연산자 오버로딩(Operator Overloading) 이라고 합니다.
1. 기본 연산자 오버로딩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Vector {
var x: Int
var y: Int
}
func + (lhs: Vector, rhs: Vector) -> Vector {
return Vector(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}
let v1 = Vector(x: 2, y: 3)
let v2 = Vector(x: 4, y: 1)
let result = v1 + v2
print(result.x, result.y) // 6 4
+연산자를Vector타입에 맞게 오버로딩
2. 복합 대입 연산자 (+=)
1
2
3
4
5
6
7
8
9
extension Vector {
static func += (lhs: inout Vector, rhs: Vector) {
lhs = lhs + rhs
}
}
var v3 = Vector(x: 1, y: 2)
v3 += v1
print(v3.x, v3.y) // 3 5
+=연산자를Vector타입에 적용
3. 비교 연산자 (==)
1
2
3
4
5
6
7
extension Vector: Equatable {
static func == (lhs: Vector, rhs: Vector) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
print(v1 == v2) // false
Equatable을 준수하여==연산자 정의
4. 커스텀 연산자 정의
1
2
3
4
5
6
7
prefix operator √
prefix func √ (value: Double) -> Double {
return value.squareRoot()
}
print(√9) // 3.0
√연산자를 새롭게 정의하여 제곱근을 반환하는 기능 추가
5. Comparable 프로토콜을 활용한 <, > 오버로딩
1
2
3
4
5
6
7
extension Vector: Comparable {
static func < (lhs: Vector, rhs: Vector) -> Bool {
return (lhs.x * lhs.x + lhs.y * lhs.y) < (rhs.x * rhs.x + rhs.y * rhs.y)
}
}
print(v1 < v2) // false
Comparable프로토콜을 구현하여<,>연산자 사용 가능
연산자 오버로딩을 활용하면 코드의 직관성을 높이고, 커스텀 타입을 더욱 자연스럽게 사용할 수 있습니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.