Recent Posts
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 | 31 |
Tags
- Spring Batch
- 코루틴 빌더
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- k8s #kubernetes #쿠버네티스
- 자원부족
- mp4fpsmod
- 겨울 부산
- kotlin
- preemption #
- JanusWebRTCGateway
- PersistenceContext
- 오블완
- python
- PytestPluginManager
- 코루틴 컨텍스트
- 달인막창
- vfr video
- 깡돼후
- VARCHAR (1)
- 개성국밥
- JanusWebRTCServer
- Value too long for column
- table not found
- taint
- 티스토리챌린지
- pytest
- JanusGateway
- JanusWebRTC
- tolerated
- terminal
Archives
너와 나의 스토리
[Kotlin] 재귀 함수 값(val) 사용하기, 재귀 함수 초기화 문제 해결 by lazy 본문
Programming Language/Kotlin
[Kotlin] 재귀 함수 값(val) 사용하기, 재귀 함수 초기화 문제 해결 by lazy
노는게제일좋아! 2021. 9. 6. 09:08반응형
재귀 함수 값 사용하기
- 팩토리얼 함수를 구현한다고 해보자.
- 다음과 같이 재귀 함수를 정의하는 것은 쉽다.
-
fun factorial(n: Int): Int { return if (n <= 1) { n } else { n * factorial(n - 1) } }
-
- 이를 재귀 함수 값으로 만들어 보자.
-
val factorial: (Int) -> Int = { n -> if (n <= 1) n else n * factorial(n - 1) }
- 맞게 구현한 것처럼 보이지만 factorial(n-1) 재귀 호출하는 부분에서 factorial이 initialized(초기화)되어야 한다고 컴파일 에러가 발생한다.
- Why?
- factorial(n-1)을 호출하는 부분에서는 아직 factorial이 정의되지 않은 상태이기 때문이다.
- 해결책
- lateinit 또는 by lazy를 사용해 문제를 해결할 수 있다.
- lateinit 사용하기
-
object Factorial { lateinit var factorial: (Int) -> Int init { factorial = { n -> if (n <= 1) n else n * factorial(n - 1) } } }
- 이 경우, var을 사용해야하는 문제점이 있다.
-
- by lazy 사용하기
-
val factorial: (Int) -> Int by lazy {{ n:Int -> if (n <= 1) n else n * factorial(n - 1) }}
- 이렇게 정의하는 경우 초기화 문제가 생기지 않는다.
- 또한 val을 사용할 수 있기 때문에 이상적인 형태라고 볼 수 있다.
-
-
반응형
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] takeIf & takeUnless (0) | 2022.06.19 |
---|---|
[Kotlin] 재귀 함수를 꼬리 재귀 함수로 변환하여 최적화하는 방법 (tailrec 사용) (0) | 2021.09.10 |
[Kotlin] 재귀 함수의 꼬리 호출 제거(TCE): tailrec 키워드 (0) | 2021.09.06 |
[Kotlin] 안전하게 프로그래밍 하기 (0) | 2021.08.23 |
[Kotlin] 위임 프로퍼티(delegated property) / by lazy()를 사용한 초기화 지연 / lateinit (0) | 2021.06.29 |
Comments