Language/Kotlin

[Kotlin 함수형 (2)] 연산자 오버로딩 - inline(인라인), infix(중위)

728x90
반응형

 

인라인(inline) 함수

 

 

 

  • Kotlin 코드가 Java 코드로 변경될 때 함수를 호출하는 코드를 함수내에 구현한 코드로 변경하는 함수이다.
  • 함수 호출 방식은 전체 코드양이 줄어들어 메모리를 적게 쓴다는 장점이 있지만 호출 시 코드 흐름이 이동하고 다시 돌아와야 하기 때문에 작업량이 늘어난다.
  • 인라인 함수는 전체 코드양이 늘어 메모리를 더 많이 사용하지만 코드 흐름의 이동 없이 수행되기 때문에 작업량이 늘어나지 않는다.
fun main() {
    testFunc1()
    testFunc1()

    testFunc2()
    testFunc2()
}

fun testFunc1(){
    println("------------------------")
    println("testFunc1")
    println("------------------------")
}

inline fun testFunc2(){
    println("------------------------")
    println("testFunc2")
    println("------------------------")
}

 

중위(infix) 함수

  • 함수를 연산자처럼 사용할 수 있는 함수이다.
  •  
fun main() {

    val v1 = 100
    val r1 = v1.add2(50)
    println("r1 : $r1")

    val r2 = v1 add2 50
    println("r2 : $r2")

    val r3 = v1.minus2(50)
    println("r3 : $r3")

    val r4 = v1 minus2 50
    println("r4 : $r4")
}

infix fun Int.add2(a1:Int) : Int{
    return this + a1
}

infix fun Int.minus2(a1:Int) : Int{
    return this - a1
}

 

 

 

 

연산자 오버로딩

  • Java에서 정수와 정수를 더하면 더하기 연산을 수행하여 결과를 전달한다.
  • Kotlin은 모든 값을 객체로 만들어 객체로 관리하기 때문에 코드에 정수를 작성하면 정수로 관리하는 것이 아닌 정수 값을 관리하는 객체를 생성하여 객체로 관리하게 된다.
  • 따라서 더하기 연산 자체가 일반적인 연산 방식으로 동작하지 못한다.
  • Kotlin에서는 객체와 객체를 연산자를 통해 연산을 하게 되면 연산을 수행하는 것이 아닌 객체 내의 메서드를 호출한다.
  • 호출된 메서드의 객체를 반환 받아 이를 연산의 결과로 사용하게 된다.

단항 연산자

Expression Translated to
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
val num1 = 100
val num2 = 200

val a1 = num1 + num2
println("a1 : $a1")	// 300

val a2 = num1.plus(num2)
println("a2 : $a2")	// 300

 

증감 연산자

Expression Translated to
a++ a.inc()
a-- a.dec()

 

산술 연산자

Expression Translated to
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.rem(b)a.mod(b)
a .. b a.rangeTo(b)

 

대입 연산자

Expression Translated to
a += b a.plusAssign(b)
a -= b  
a *= b  
a /= b  
a %= b  

 

비교 연산자

Expression Translated to
a == b a.compareTo(b) == 0
a != b a.compareTo(b) != 0
a > b a.compareTo(b) > 0
a < b a.compareTo(b) < 0
a >= b a.compareTo(b) >= 0
a <= b a.compareTo(b) <= 0

 

 

 

 

 

 

 

 

728x90
반응형