안드로이드 개발자의 창고
[18일차 Kotlin] 연산자 오버로딩(Operator Overloading) 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 연산자 오버로딩
- Kotlin은 모든 값을 객체로 만들어 객체로 관리하기 때문에 코드에 정수를 작성하면 정수로 관리하는 것이 아닌 정수 값을 관리하는 객체를 생성하여 객체로 관리하게 된다.
- 따라서 더하기 연산 자체가 일반적인 연산 방식으로 동작하지 못한다.
- Kotlin에서는 객체와 객체를 연산자를 통해 연산을 하게 되면 연산을 수행하는 것이 아닌 객체 내의 메서드를 호출한다.
-
호출된 메서드의 객체를 반환 받아 이를 연산의 결과로 사용하게 된다.
📖 예제 코드
class TestClass(var a1:Int, var a2:Int){
operator fun plus(target:TestClass):TestClass{
var r1 = this.a1 + target.a1
var r2 = this.a2 + target.a2
val result = TestClass(r1, r2)
return result
}
operator fun minus(target: TestClass): TestClass{
var r1 = this.a1 - target.a1
var r2 = this.a2 - target.a2
val result = TestClass(r1, r2)
return result
}
}
fun main(){
val num1 = 100
val num2 = 200
val a1 = num1 + num2
println("a1 : $a1") // 300
val a2 = num1.plus(num2)
println("a2 : $a2") // 300
val obj1 = TestClass(100, 200)
val obj2 = TestClass(10, 20)
val obj3 = obj1 + obj2
println("obj3.a1 : ${obj3.a1}") // 110
println("obj3.a2 : ${obj3.a2}") // 220
val obj4 = obj1 - obj2
println("obj4.a1 : ${obj4.a1}") // 90
println("obj4.a2 : ${obj4.a2}") // 180
}
✔️ 코드 해석
- TestClass
- operator fun plus(target:TestClass):TestClass{ ... }
- 더하기(+) 연산자를 사용하면 호출되는 메서드 구현
- 연산자를 기준으로 좌측의 객체(obj1)를 통해 메서드가 호출(this)되고 우측의 객체(obj2)가 매개변수(target)로 들어온다.
- operator fun minus(target: TestClass): TestClass{ ... }
- 빼기(-) 연산자를 사용하면 호출되는 메서드 구현
- operator fun plus(target:TestClass):TestClass{ ... }
- main()
- val a1 = num1 +num2
- kotlin은 모든 값을 객체로 만들어 객체로 관리하기 때문에 plus() 메서드가 호출된다.
- val a2 = num1.plus(num2)와 동일한 결과인 300이 출력된다.
- val obj3 = obj1 + obj2
- obj1과 obj2는 TestClass의 객체로 + 연산자를 사용하면 TestClass에서 오버로딩된 plus()가 호출된다.
- 따라서 obj3의 a1은 110, a2에는 220이 저장된다.
- val obj3 = obj1 - obj2
- obj1과 obj2는 TestClass의 객체로 - 연산자를 사용하면 TestClass에서 오버로딩된 minus()가 호출된다.
- 따라서 obj3의 a1은 90, a2에는 180이 저장된다.
- val a1 = num1 +num2
'Computer > Kotlin' 카테고리의 다른 글
[18일차 Kotlin] 인라인 함수(Inline Function) (0) | 2023.05.23 |
---|---|
[18일차 Kotlin] 함수형 프로그래밍 (0) | 2023.05.23 |
[18일차 Kotlin] Scope Function(범위 지정 함수 - let, apply, run, with, also) (0) | 2023.05.23 |
[18일차 Kotlin] 고차 함수 (0) | 2023.05.23 |
[17일차 Kotlin] Sealed Class (0) | 2023.05.20 |