인프런 커뮤니티 질문&답변

콜라곰님의 프로필 이미지
콜라곰

작성한 질문수

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

20강. 코틀린의 scope function

run의 사용 방법에 대해 궁금한 점이 있습니다

해결된 질문

작성

·

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이 중요한 부분인 것 같습니다! 언제든 또 편하게 질문 주세요~~ 감사합니다!!! 🙏🙏

콜라곰님의 프로필 이미지
콜라곰
질문자

항상 친절한 답변 감사드립니다!

콜라곰님의 프로필 이미지
콜라곰

작성한 질문수

질문하기