(Effective Kotlin) Item No.12 연산자 오버로딩 시 적절하게 사용하라

계승을 계산하는 함수가 있다고 가정합니다.


이 함수는 Int 확장 함수로 정의되어 있어 편리하게 사용할 수 있습니다.


팩토리얼은 !
이를 나타내는 데 기호가 사용되지만 Kotlin은 이러한 연산자를 지원하지 않습니다.

그러나 아래와 같이 연산자 오버로딩을 사용하여 만들 수 있습니다.

.


이렇게 할 수 있지만 이렇게 해서는 안 됩니다.

이 함수의 이름은 아닙니다.

함수 이름이 아니므로 계승 연산이 아닌 논리 연산에 사용해야 합니다.

이와 같은 코드 작성은 오해의 소지가 있습니다.

모든 연산자는 연산자 대신 함수로 호출할 수 있습니다.



Kotlin에서 각 연산자의 의미는 항상 동일하게 유지됩니다.

예를 들어 아래 코드를 참조하십시오.


이 코드는 항상 다음과 같은 코드로 변환됩니다.


이들은 특정 이름을 가진 함수이며 모든 연산자는 이러한 이름이 나타내는 작업을 수행해야 합니다.

따라서 연산자의 사용은 이름만으로 심각하게 제한됩니다.

따라서 계승을 계산하려면 !
연산자를 사용해서는 안 됩니다.



명확하지 않은 경우

문제는 컨벤션을 충족하는지 여부가 확실하지 않을 때입니다.

예를 들어, 기능을 세 배로 만든다는 것은 무엇을 의미합니까?


의미가 불분명한 경우 중위를 사용하여 확장 기능을 사용하는 것이 좋습니다.

일반 이항 연산자 형식처럼 사용할 수 있습니다.


최상위 기능을 사용하는 것도 좋습니다.

사실 함수를 n번 호출하는 것은 다음과 같은 형식으로 stdlib에 이미 구현되어 있습니다.

규칙을 무시할 때

지금까지 본 연산자 오버로딩 규칙을 안전하게 무시할 수 있는 중요한 경우가 있습니다.

도메인 특정 언어(DSL)를 설계할 때입니다.


(요약)

이름에 따라 연산자 오버로딩을 사용하십시오. 연산자의 의미가 명확하지 않으면 연산자 오버로딩을 사용하지 않는 것이 좋습니다.

대신 이름이 있는 일반 함수를 사용하십시오.

정말로 스피커 형태로 사용하고 싶다면 중위 확장 함수나 최상위 함수(클래스나 다른 객체 안에 있지 않은 가장 바깥쪽 함수)를 사용하세요.