Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[18일차 Kotlin] 연산자 오버로딩(Operator Overloading) 본문

Computer/Kotlin

[18일차 Kotlin] 연산자 오버로딩(Operator Overloading)

Wise-99 2023. 5. 23. 02:18

 

 

출처 : 안드로이드 앱스쿨 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{ ... }
      • 빼기(-) 연산자를 사용하면 호출되는 메서드 구현
  • 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이 저장된다.