plus
라는 이름의 특별한 메소드를 정의하면그 클래스의 인스턴스에 대해 +
연산자를 사용할 수 있다.관례(convention)
**라고 부른다.코틀린에서 관례를 사용하는 가장 단순한 예는 산술 연산자다.
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)
plus
함수 앞에 꼭 operator
키워드가 있어야한다. → 오버로딩 하는 함수 앞에 있어야함operator
키워드를 붙임으로써 어떤 함수가 관례를 따르는 함수임을 명확히 할 수 있다.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)
}
이름은 같지만 파라미터 타입이 서로 다른 연산자 함수를 여럿 만들 수 있다. → 오버로딩