반응형
7.1 산술 연산자 오버로딩
- String 에 대해 + 연산자를 사용하는 것 또한 산술 연산자 오버로딩
- BigInteger 클래스를 다룬다면 add 메소드를 명시적으로 호출하기 보다는 + 연산을 사용하는 편이 더 낫다?
- 컬렉션에서도 += 연산자를 사용하도록 할 수 있다
7.1.1 이항 산술 연산 오버로딩
data class Point(val x : Int, val y : Int){
operator fun plus(other: Point): Point {
return Point(x+otherx, y+other.y)
}
}
val p1 = Point(10,20)
val p2 = Point(30,40)
println(p1 + p2)
- 위 코드에서 + 를 써주면 plus 함수가 호출된다
- plus 앞에 operator을 붙임으로서, 관례를 따르는 함수임을 명시
- * 는 times, /는 div %는 mod, - 는 minus 등..
- 직접 정의한 함수로 구현하더라도 연산자 우선순위는 표준 숫자 타입에 대한 연산자 우선순위와 같다
- 연산자의 두 파라미터가 같은 타입일 필요는 없다
- 그대신 kotlin 연산자가 자동으로 교환법칙을 지원하지는 않는다
7.1.2 복합 대입 연산자 오버로딩
plus 연산자를 오버로딩 하면 + 뿐만 아니라 자동으로 += 도 사용할 수 있게 된다
+=, -= : 복합 대입 연산자
원래 += 를 쓰면 결과 값을 표현하는 객체를 만들어서 참조를 바꿔치기 한다
참조 바꿔치기 대신 원래 객체의 내부 상태를 변경하도록 하고 싶다면?
- plusAssign, minusAssign, timesAssign 등을 사용
반환 타입이 Unit인 plusAssign 함수를 정의하면 코틀린은 += 연산자에 그 함수를 사용한다?
kotlin 에서 Unit은 Java에서 Void
plus는 새로운 객체를 반환해주어야 했지만, plusAssign은 새로운 객체를 반환하는 것이 아닌 원래 객체를 변경하는 것이기 때문에 반환 값이 없다
+=
- plus, plusAssign 양쪽으로 컴파일 할 수 있다
- 두개를 모두 정의하면 컴파일러 오류
- 일반 연산자를 사용하면 해결할 수 있다?
- var을 val로 바꾸어서 plusAssign 적용이 불가능하게 할 수도 있다
- 일반적으로는 둘다 정의하지 말기
코틀린 표준 라이브러리에서는
- + 는 plus, += 는 plusAssign
7.1.3 단항 연산자 오버로딩
operator fun Point.unaryMinus() : Point{
return Point(-x, -y)
}
val p = Point(10,20)
println(-p)
- 단항 연산자도 이항연산자와 마찬가지로, 미리 정해진 이름의 함수를 operator로 선언하면 된다
- + : unaryPlus, - : unaryMinus, ! : not, ++ : inc, -- dec
반응형
'Languages' 카테고리의 다른 글
kotlin의 구조분해 선언과 component 함수 (0) | 2020.05.18 |
---|---|
kotlin 의 비교 연산자 오버로딩 (equals, compareTo) (0) | 2020.05.18 |
kotlin의 null 가능성과 collection (0) | 2020.05.07 |
kotlin의 원시타입 (int, boolean, any) (0) | 2020.05.07 |
kotlin의 null 가능성 (?. ?: !!) (0) | 2020.05.07 |