본문 바로가기

볼봇의 코딩 생활/Kotlin

[코틀린] 산술 연산자 오버로딩



자, 오늘은 코틀린의 연산자 오버로딩에 대해 알아 보겠습니다!



자바에서 메소드 오버로딩과 꽤 비슷한 개념인데요. (많이 비슷하다고 해야겠네요.)



이름 그대로, 코틀린에서는 연산자를 오버로딩 할 수 있습니다!



코틀린에서, 이렇게 여러 연산을 지원하기 위해 특별한 이름이 붙은 메소드관례 라고 부릅니다.

지금부터, 관례 에 대해 알아보도록 할거에요.



우선 메소드 오버로딩이 어떤건지 간단히 알아보겠습니다!


1
2
3
4
5
6
7
8
9
class OverrideStudy {
    public void echoAqoursMember(int printSize) {
        ...
    }
    public void echoAqoursMember(boolean echoAll) {
        ...
    }
}
 
cs



위에, 자바코드를 통해 간단한 예를 들어보았는데, 매개변수 또는 인자값의 유형이 달라 

같은 이름의 함수를 여러번 정의 할 수 있도록 하는 기술 입니다.



알고 계시겠죠?!



이제, 코틀린에서 사용해보겠습니다!


아주 단순한 관례의 예로, 산술 연산자를 써볼거에요.



1
2
3
4
5
6
7
8
9
10
11
12
fun main(args: Array<String>) {
    val p1 = Point(20,30)
    val p2 = Point(50,60)
    val pp = p1 + p2
    println("x : ${pp.x} | y : ${pp.y}")
}
 
data class Point(val x: Int, val y: Int) {
    operator fun plus(o: Point) : Point {
        return Point(this.x + o.x, this.y + o.y)
    }
}
cs



실행 결과

x : 70 | y : 90



main 함수에서 이상한 부분이 보일 것 입니다.


Point 형 p1 과 p2 를 둘이 + 연산 하고 있습니다.


자바 유저는 역시 적응이 잘 안되네요.



val pp = p1 + p2



이 부분은 아래 코드와 정확히 같습니다.


val pp = p1.plus(p2)




그리고, 함수를 정의하는 부분에서 operator 라는 수식어가 붙었습니다.

 

이는 코틀린의 문법으로, 연산자를 오버로딩 하는 함수 앞에는 꼭 꼭 붙여줘야 한답니다.




이렇게 함으로 써, 우리가 Point 클래스에서 정의한 plus 함수를 호출 하여 연산을

진행 한 것을 알 수 있습니다.



+ 연산 말고도, 아래 연산들을 지원합니다.


코틀린이 지원하는 이항 산술 연산자


a + b 

plus 

a - b 

minus 

a % b 

rem 

a / b 

div 

a * b 

times 





마지막으로, minus 까지만 확인해보고 이번 글을 마치도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fun main(args: Array<String>) {
    val p1 = Point(20,30)
    val p2 = Point(50,60)
    val pp = p1 - p2
    println("x : ${pp.x} | y : ${pp.y}")
}
 
data class Point(val x: Int, val y: Int) {
    operator fun plus(o: Point) : Point {
        return Point(this.x + o.x, this.y + o.y)
    }
 
    operator fun minus(o: Point) : Point {
        return Point(this.x - o.x, this.y - o.y)
    }
}
cs





operator 수식어를 붙여 이 함수가 관례를 따르고 있다고 명확히 해주었고


실제로 '-' 연산을 사용해보았습니다.




여기까지 산술 연산자 오버로딩 이었습니다.


다음에는 복합 대입 연산자 오버로딩에 대해 알아볼게요!