익명 함수
일반 함수이지만 이름이 없는 함수.
익명 함수의 경우, 함수로 따로 선언하여 사용하는 것이 아닌 변수 선언시에 그대로 넣어서 사용 가능한 함수이다.
- add1의 경우 익명 함수를 생략하지 않고 그대로 사용한 것이다.
- 매개 변수에 자료형을 써주면 add2 처럼 선언부의 자료형이 생략 가능하고,
- add3와 같이 람다식 함수와 비슷하게 선언 또한 가능하다.
인라인 함수(Inline Function)
인라인 함수는 이 함수가 호출되는 곳에 함수 본문의 내용을 모두 복사해 넣어 함수의 분기 없이 처리되기 때문에 코드의 성능을 높일 수 있다.
하지만, 인라인 함수는 코드가 복사되어 들어가기 때문에 내용은 대게 짧게 작성해야 한다.
람다식 매개변수를 가지고 있는 함수에서 동작한다.
인라인 함수로 선언되는 경우, 매개변수로 사용되는 람다식에 return을 사용할 수 있다.
이와같이 사용하게 되는데, 일반 함수와 다를바 없어 보이지만, Decompile을 해보면 다른것을 알 수 있다.
이처럼 호출에 따라 2번 복사되어 사용되는 것을 알 수 있다.
인라인 함수 제한
인라인 함수의 매개변수로 사용한 람다식의 코드가 너무 길거나, 인라인 함수 본문 자체가 너무 길면 컴파일러에서 성능 경고를 할 수 있다.
따라서 inline 함수에 noinline 키워드를 넣어서 인라인 함수지만 해당 변수는 인라인으로 처리하지 않고 분기하여 호출하는 방식으로 사용하여 해당 문제를 해결할 수 있다.
이처럼 noinline 키워드를 넣는다면 해당 람다식은 복사되지 않고 분기하여 호출하는 것을 확인할 수 있다.
비지역 반환
람다식 함수에서 return문을 만났지만 의도하지 않게 바깥 함수가 반환처리 되는 것.
위 예제처럼 선언을 하는 경우, 출력되는 값에 end는 없게 된다.
nonLocal 함수에서 호출된 out(a)를 통해 return 이 되기 때문에 end는 호출되지 않고 nonLocal 함수가 종료되기 때문이다.
따라서 이러한 경우를 막기 위하여 crossinline 키워드를 사용한다.
crossinline 키워드는 비지역 반환을 금지해야 하는 람다식에 사용한다.
위의 예제에서 crossinline 키워드를 추가하게 되면, 람다식 매개변수에 선언된 return을 사용하지 못하게 된다.
확장 함수
기존의 클래스에 원하는 함수를 더 추가할 수 있는 개념.
fun 확장 대상.함수 이름(매개변수, ...): 반환값 {
...
return 값
}
이러한 형태로 사용하면 된다.
String class에 getSumText라는 확장 함수를 만들어서 사용한 예제이다.
출력 값은 Sample text 가 나오게 된다.
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 5장. 클래스와 객체 (0) | 2020.06.29 |
---|---|
[Kotlin] 4장. 프로그램의 흐름 제어 (0) | 2020.06.26 |
[Kotlin] 3장. 함수와 함수형 프로그래밍 2 - 고차 함수와 람다식 (0) | 2020.06.25 |
[Kotlin] 3장. 함수와 함수형 프로그래밍 1 - 함수형 프로그래밍 (0) | 2020.06.25 |
[Kotlin] 2장. 변수와 자료형, 연산자 2 - 변수와 자료형 (0) | 2020.06.24 |