Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- ingress
- 코틀린
- cloud native
- java
- MSA
- ansible
- 마이크로서비스
- Semaphore
- 자바
- 머신러닝
- 쿠버네티스
- Kotlin
- decorator 패턴
- spring microservice
- 동기화
- 헬름
- Adapter 패턴
- MySQL
- devops
- 클라우드 네이티브
- CRD
- 클라우드 네이티브 자바
- cloud native java
- 익명클래스
- nGrinder
- Algorithm
- Stress test
- Spring
- Microservice
- kubernetes
Archives
- Today
- Total
카샤의 만개시기
코틀린 재귀함수 tailrec 본문
Java에서 재귀함수를 사용하게되면 함수가 함수를 호출하면서 콜스택이 계속 적재되어 stack overflow 현상이 일어나기도 하고, 콜 스택 생성에 따른 성능 저하를 경험하기도 합니다.
꼬리 재귀
재귀 함수를 구현할 때 마지막(Tail)에 자기 자신을 호출(Recursion)하는 형태의 함수
kotlin에서 꼬리 재귀를 사용하게 되면 자바에서 있었던 이런 문제들을 해결할 수 있으며 적절하지 않은 코드가 작성이 되었을때 warning도 받을 수 있습니다.
다음과 같은 재귀함수를 작성하였고, 함수의 앞 부분에는 tailrec
예약어를 붙였습니다.
tailrec fun tailrecPrint(no: Int = 1, count: Int = 1) {
println("tailrecPrint")
return if(no == count) return else tailrecPrint(no - 1, count)
}
fun main(args: Array<String>) {
tailrecPrint(3)
}
위에서 작성한 코틀린 재귀함수 코드가 자바로 변형된 결과는 다음과 같습니다
public static final void tailrecPrint(int no, int count) {
while(true) {
String var2 = "tailrecPrint";
System.out.println(var2);
if (no == count) {
return;
}
--no;
}
}
변형된 함수를 보면 재귀호출 코드는 사라지고 일반 반복문으로 변경되면서 콜 스택 생성에 따른 성능저하나, stack overflow 문제로부터 자유로워질 수 있습니다.
'Kotlin' 카테고리의 다른 글
코틀린 제네릭 (가변성, 스타 프로젝션, reified) (0) | 2019.11.30 |
---|---|
코틀린 object (0) | 2019.08.02 |
코틀린 한정클래스 (Sealed) (0) | 2019.08.02 |
코틀린 Unit vs Nothing (0) | 2019.08.02 |
코틀린 lateinit과 by lazy (0) | 2019.07.23 |
Comments