본문 바로가기
Android/Kotlin

Kotlin : local, infix, inline functions, Operator Overloading

by 2Plus 2020. 5. 25.

 

Local Functions (지역 함수)

함수 안에서 scope 내에 지역 변수를 선언해서 사용할 수 있듯이 함수의 scope 내에서 지역 함수를 선언하여 사용할 수 있다. 당연히 해당 scope 밖에서는 지역 함수를 사용할 수 없다. 내부에서 사용할 때 선언하여 사용할 수 있다.

 

[Code]

 

 

[결과]

 

 

 

Local Return

[Code]

 

 

 위의 코드를 실행하면 어떻게 될까?

 

[결과]

 

 

 forEach문 안에서 return을 하면서 함수 return이 되어서 함수가 종료된다. 이때 forEach문 안에서만 return을 하려 했다면 return@forEach를 사용하면 된다. @ 뒤에 return 할 scope를 지정해주면 의도한 대로 사용이 가능하다.

 

 

[Code]

 

 

[결과]

 

 

 아까와는 다르게 main 함수가 마지막 라인까지 모두 실행된 것을 확인할 수 있다. 사실 위와 같이 사용하는 것은 큰 의미가 없고 local return이 어떻게 활용될 수 있는지를 확인해 보자.

 

[Code]

 

 

[결과]

 

 

 

Infix Functions

[Code]

 

 

[결과]

 

 

 Infix Function을 사용하여 String class를 확장해본 예시이다. Infix function은 위의 예시에서 "test" addToSides "!!" 와 같이 가운데에 함수 이름을 써서 사용할 수도 있다. 또, Infix function은 파라미터로 한 개의 인자밖에 받지 못한다.

 

 

Inline Functions (인라인 함수)

 Inline Function을 사용하면 다른 함수를 호출할 때, 호출 스택에 추가되는 것이 아니라 해당 함수가 하는 로직들이 호출한 자리에 flat하게 들어가도록 컴파일이 진행된다. 람다를 전달할 때 Inline Function을 사용하는 것이 좋다.

 

[Code]

 

 

[결과]

 

 

 inline이라는 키워드를 함수 선언부 앞에 추가해준 것 말고는 코드와 실행 결과가 일반적인 경우와 다르지 않다. inline으로 함수를 선언하면서 실제로 무엇이 달라졌는지는 컴파일된 java byte code를 확인하면 알 수 있다.

 

[Inline - Java Byte Code]

 

 

Java byte code를 확인해보면 위와 같이 함수가 아닌 것처럼 로직이 통째로 들어가 있는 것을 확인할 수 있다.

 

Inline이 아닌 일반적인 경우에는 어떻게 진행되는지를 보면 정확히 무엇이 다른지를 비교해볼 수  있다.

 

[Code]

 

 

[결과]

 

 

 결과는 물론 앞서 말했듯이 동일하다.

 

[Non Inline - Java Byte Code]

 

 

 하지만 inline이 아닌 경우의 Java Byte Code를 확인해보면 위와 같이 아까와는 다르게 함수를 호출하고 있는 것을 알 수 있다. 추가로, inline을 사용할 때 주의해야 할 사항이 있다. inline 함수를 사용하게 되면 코드상으로 해당 함수를 호출하는 부분으로 로직들이 들어가게 되는 것과 inline 로직이 많고 함수가 큰 경우를 고려하여 적절히 사용해야 한다.

 

 

Operator Overloading

 Operator Overloading을 사용하면 "+", "-"와 같은 Kotlin의 operator를 오버로딩해서 사용할 수 있다. String 두 개를 합칠 때 편하게 "abc" + "def"를 하면 "abcdef"가 되는 것처럼, 해당 오퍼레이터의 동작을 변경하거나 지원되지 않는 클래스 타입에 대해서 직접 만들어 사용하고 싶을 때 쓰면 된다.

 

[Code]

 

 

[결과]

 

 

 하지만 Operator Overloading을 과도하게 사용하는 것은 좋지 않다. 대부분의 경우는 함수나 어떤 로직으로 구현하는 것이 좋고 과하게 남용해서는 안 된다. https://kotlinlang.org/docs/reference/operator-overloading.html 이쪽 문서를 한번 참고하여 읽어보면 좋다.

 

 

반응형

'Android > Kotlin' 카테고리의 다른 글

Kotlin - Coroutine 추가 정리 2  (355) 2020.05.29
Kotlin - Coroutine 추가 정리 1  (260) 2020.05.27
Kotlin - Sealed Class  (609) 2020.05.21
Kotlin : run, with, let, also and apply  (4) 2020.05.17
IntelliJ에서 RxKotlin 사용하는 방법  (562) 2020.05.14

댓글