자, 오늘은 코틀린의 연산자 오버로딩에 대해 알아 보겠습니다!
자바에서 메소드 오버로딩과 꽤 비슷한 개념인데요. (많이 비슷하다고 해야겠네요.)
이름 그대로, 코틀린에서는 연산자를 오버로딩 할 수 있습니다!
코틀린에서, 이렇게 여러 연산을 지원하기 위해 특별한 이름이 붙은 메소드를 관례 라고 부릅니다.
지금부터, 관례 에 대해 알아보도록 할거에요.
우선 메소드 오버로딩이 어떤건지 간단히 알아보겠습니다!
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 수식어를 붙여 이 함수가 관례를 따르고 있다고 명확히 해주었고
실제로 '-' 연산을 사용해보았습니다.
여기까지 산술 연산자 오버로딩 이었습니다.
다음에는 복합 대입 연산자 오버로딩에 대해 알아볼게요!