해결된 질문
작성
·
536
1
안녕하세요 강사님. 완강하고 코틀린을 계속 공부하다가 궁금한 점이 생겨 질문 드립니다.
run
의 경우에는 아래와 같이 확장함수가 아닌 일반적인 메소드의 형태로 정의된 것이 있는 것을 발견했습니다.
그래서 메소드를 작성할 때 run
을 사용해서 작성할 수도 있겠다는 생각이 들더라구요. 예시로 Int
의 확장함수로 거듭제곱을 수행하는 pow()
라는 메소드를 작성할 때 보통은 다음과 같이 작성하겠죠.
fun Int.pow(n: Int): Long {
var result = 1L
repeat(n) { result *= this }
return result
}
그런데 위의 run
을 사용해서 아래처럼 작성할 수도 있었고 두 경우 모두 같은 결과를 반환하는 것을 볼 수 있었습니다.
fun Int.pow(n: Int) = run {
var result = 1L
repeat(n) { result *= this }
result
}
그러면 메소드를 작성할 때 두가지 방법 모두 사용할 수 있다고 생각되는데, 어느쪽을 사용하는 것이 좋은 방법일지 강사님의 의견을 듣고싶어서 질문 남겨봅니다.
답변 1
1
안녕하세요, 콜라곰님!! 이번에도 좋은 질문 감사드립니다! 😊
말씀해주신 것처럼 run
의 경우에는 1) 확장함수 run
도 존재하고 2) 일반함수 run
도 존재합니다. 또한, 둘 모두 적절하게 함수의 선언부와 구현부(body)를 이어주는데 활용할 수 있죠!
질문 주신 내용에 대해 답변 드려보자면, 저 같은 경우는 아래 1번 2번 중 1번 형태를 선호하는 편입니다!
// 1번
fun Int.pow(n: Int): Long {
var result = 1L
repeat(n) { result *= this }
return result
}
// 2번
fun Int.pow(n: Int) = run {
var result = 1L
repeat(n) { result *= this }
result
}
그 이유가 특별하게 존재하는 것은 아니고요! 아무래도 Java를 먼저 하고 와서 1번에 제게 더 익숙한 것 같습니다. 실제로 두 기능은 거의 차이가 없기 때문에 run
을 사용해 작성된 함수를 보더라도 꼭 바꾸어야 할 필요성을 느끼지는 않습니다 ㅎㅎㅎ
답변이 도움이 되었을지 모르겠네요! 함께 협업하는 상황이라면, Team Convention이 중요한 부분인 것 같습니다! 언제든 또 편하게 질문 주세요~~ 감사합니다!!! 🙏🙏
항상 친절한 답변 감사드립니다!