우주먼지

💡 복합 대입 & 비교 연산자 오버로딩

코틀린은 특정 연산자의 역할을 함수로 정의할 수 있다.

연산자 오버로딩을 할때 operator라는 키워드를 사용하며 이미 정의된 함수를 새롭게 정의하면 된다.

 

복합 대입 연산자 오버로딩

"+=", "-=" 등의 연산자를 복합 대입 연산자라고 하며,
"+" 대응 함수인 plus와 같은 연산자를 오버로딩하면
코틀린은 그와 관련된 연산자인 "+=" 도 자동으로 구현해준다.

var point = Point(1, 2)
point += Point(3, 4) // point = point + Point(3, 4)와 동일하다

// 결과값
Point(x=4, x=6)

비교연산자 오버로딩 - 동등성 연산자 : equels

코틀린에선 모든 객체에 비교 연산을 수행하는 경우,
equals나 compareTo를 호출해야 하는 자바와 달리
"==" 연산자를 직접 사용할 수 있어서 비교 코드가 더 간결하며 이해가 쉽다.

 

코틀린은 "==" 를 equals()로 컴파일하며, "!=" 역시 equals()를 사용하여,
결과 값을 not 처리하는 식으로 동작한다.

 

a == b 라는 코드는 내부에서 인자의 null 체크를 하므로,
다른 연산과 달리 null이 될 수 있는 값에도 적용할 수 있는 이유이다.

 

즉, a == b는 내부적으로 a?.equals(b) ?: (b == null)로 동작한다.

 

이경우 a가 null인지 판단해서 null이 아닌 경우만 a.equals(b)가 호출되고,
만약 a가 null이라면 b도 null인 경우에만 true가 반환된다.

class Point(val x: Int, val y: Int) {
    override fun equals(other: Any?): Boolean {
        return super.equals(other)
    }
}

equals() 함수 앞에 override가 붙은 이유는 Any에 정의된 함수이므로 오버라이딩해서 사용하자.

Any에 정의된 equals의 소스코드를 보면 equals() 함수에 operator가 명시되어 있다.

 

그렇기 때문에, 하위 클래스에서는 override를 해서 사용할 수 있지만,
Any가 최상위 객체이며 Any를 상속받는 equals()가 확장함수보다 우선순위가 높다.

 

그래서 사실상 확장 함수로 재정의해서 사용할 수가 없다.


비교연산자 오버로딩 - 순서 연산자 : compareTo

자바에서 정렬이나 최대/최소값을 비교하는 알고리즘에는 Comparable 인터페이스가 있다.

이 CompareTo 메서드를 짧게 호출할 방법이 없어서 항상 object.compareTo()의 형태이다.

 

코틀린도 똑같이 Comparable 인터페이스를 지원하며, compareTo 메서드 호출의
convention을 제공하여 비교연산자(<, >, <=.,>=)는 compareTo 호출로 컴파일 된다.

 

즉, a >= b 코드는 a.compareTo(b) >= 0 으로 컴파일 된다.

'Languages > Kotlin' 카테고리의 다른 글

Kotlin Controll Flow  (0) 2023.03.29
[Operator Overloading] 이항 & 단항 산술 연산자 오버로딩  (0) 2023.03.29
Kotlin Basic Types  (0) 2023.03.26
Kotlin Basic Syntax  (0) 2023.03.26
Java와 Kotlin의 차이  (0) 2023.03.24
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그