관례

산술 연산자 오버로딩

코틀린에서 관례를 사용하는 가장 단순한 예는 산술 연산자다.

data class Point(val x: Int, val y: Int) {
		operator fun plus(other: Point) : Point { // 연산자 함수 정의
				return Point(x + other.x y + other.y)
		}
}

val p1 = Point(10, 20)
val p2 = Point(30, 40)
println(p1 + p2) // + 로 계산하면 "plus" 함수가 호출된다.
>> Point(x=40, y=60)
operator fun Point.plus(other: Point) : Point {
		return Point(x + other.x, y + other.y)
}
함수 이름
a * b times
a / b div
a % b mod(1.1부터 rem)
a + b plus
a - b minus

위 표는 오버로딩이 가능한 이항 산술 연산자이다.

직접 정의한 함수를 통해 구현하더라도 연산자 우선순위는 표준 숫자타입과 같다.

operator fun Point.times(scale: Double) : Point {
		return Point((x * scale).toInt(), (y * sacle).toInt())
}

operator fun Double.times(point: Point) : Point {
		return ...
}

val p = Point(10, 20)
println(p * 1.5)
>> Point(x=15, y=30)

연산자를 정의할 때 두 피연산자가 같은 타입일 필요는 없다.

코틀린 연산자는 교환법칙을 지원하지 않는다.

operator fun Char.times(count: Int): String {
		return toString().repeat(count) // this.toString().repeat(count)
}

이름은 같지만 파라미터 타입이 서로 다른 연산자 함수를 여럿 만들 수 있다. → 오버로딩