인프런 영문 브랜드 로고
인프런 영문 브랜드 로고
채널톡 아이콘

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

보키님의 프로필 이미지

작성한 질문수 21

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

18강. 코틀린에서 컬렉션을 함수형으로 다루는 방법

확장함수 스타일 질문

해결된 질문

작성

·

34

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

강사님 9:54쯤에 질문이 있습니다

val 또는 fun으로 확장함수를 만들 수 있는데..

두가지 방식의 차이점이 있나요?

또는 이펙티브 코틀린 등등에서 더 선호하는 방식이 있는지, 안티패턴이나 best practice가 있다면 알고 싶습니다.

차이점이 있다면 확장함수에 val을 사용한 경우 custom getter방식으로 구현되고 호출부에 ()가 없는 반면, fun키워드를 사용한 경우에는 get()이 사용되지 않고 호출부에 ()를 해줘야 되는 것 같습니다

 

  • 1번방식: 강의에서 나온대로 val

_ 정의부:

val List<Fruit>.samePriceFilter: List<Fruit>
    get() = this.filter(Fruit::isSamePrice)

_ 호출부:

val samePriceFruits2 = fruitsInList.flatMap { it.samePriceFilter }
  • 2번방식: fun으로 사용

_ 정의부:

fun List<Fruit>.samePriceFilter(): List<Fruit> {
    return this.filter(Fruit::isSamePrice)
}

_ 호출부:

val samePriceFruits2 = fruitsInList.flatMap { it.samePriceFilter() }

답변 2

1

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 보키님! 🙂 좋은 질문 감사드립니다.

 

val 또는 fun으로 확장함수를 만들 수 있는데.. 두가지 방식의 차이점이 있나요?

에 대해서 결론부터 말씀드리면 사용하는 쪽에서 '함수'라고 여길 것인지 '프로퍼티' 라고 느낄 것인지에 대한 의미론적인 차이가 있습니다.

잘 아시겠지만 val 은 프로퍼티이고 fun 은 함수인데요!

프로퍼티는 객체 안에 있을 것 같은 '필드' 느낌을 주고 싶을 때 사용하면 좋고, '함수'는 객체에게 어떠한 행동을 요구하는 느낌을 주고 싶을 때 사용하면 좋습니다.

 

위에서 예시를 들어 주신 것처럼 Fruit.isSamplePrice 라는 Predicate을 이용해 같은 가격을 갖고 있는 과일을 추출한다고 해보겠습니다.

제가 이걸 프로퍼티로 만든다면

List<Fruit>.samePriceFruits 이라고 이름 붙일 것 같아요!

fruitsInList.flatMap { it.samePriceFilter }

이라고 서술할 때 조금 it (List<Fruit>) 안에 들어 있는 하나의 속성 같아 보이게요

 

만약 함수로 구성한다면..

List<Fruit>.filterSamplePrice() 라고 할 것 같습니다. 함수는 어떠한 행위이기에 때문에 같은 가격을 기준으로 필터링 한다~ 라는 느낌을 주고 싶습니다.

 

결론적으로 (매개변수가 필요하지 않다는 가정 아래) 두 동작 자체는 동일하고 단지 코드에 어떤 의미를 부여할 것인가에 따라 차이가 있다 라고 봐주시면 될 것 같습니다.

또 궁금한 점 생기시면 편하게 질문 남겨주세요~ 감사합니다. 🙇

보키님의 프로필 이미지
보키
질문자

오!! 지식공유자님!!

이름으로 예시를 들어주시니 쏙쏙 이해가 됐어요!!

일요일 저녁 출근하시기 전에 이렇게 자세히 답해주시고... 감사합니다!!

얼마 안남았지만 좋은 주말 저녁 보내세요 :)

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 보키님.

확장 함수의 정의 방식에 대한 질문을 주셨네요! 확장 함수를 val이나 fun으로 선언하는 것 사이에는 몇 가지 차이점이 있습니다.

  1. 사용의 간결함: val을 사용하여 정의하면 호출할 때 괄호를 사용할 필요가 없습니다. 이는 속성처럼 보일 수 있어 가독성이 높아질 수 있습니다. 예를 들면 it.samePriceFilter와 같이 호출할 수 있습니다. 반면 fun을 사용할 경우 함수처럼 괄호를 붙여 호출해야 합니다. (it.samePriceFilter())

  2. 의미적 구분: val을 이용하면 결과가 프로퍼티처럼 느껴지며, 상태가 아닌 계산을 통해 반환된 값처럼 보일 수 있습니다. 이는 읽기 전용 프로퍼티와 같은 형태로 사용할 때 유용합니다. 반면 fun을 사용하면 행동(로직 실행)에 더 적합해 보입니다.

  3. 이니셜라이제이션 시점: val의 경우 프로퍼티의 호출 시마다 실행되며, 상태를 가진 객체라면 변경 가능성이 고려되어야 합니다. fun은 명시적으로 동작을 수행하는 함수로 보이며, 호출 시마다 항상 동일한 로직을 실행합니다.

  4. 코드 스타일과 일관성: 이펙티브 코틀린 등에서 추천하는 스타일은 주로 컨텍스트에 따라 다를 수 있습니다. 간단한 계산이나 현 상태를 반환하는 경우 val 스타일이 권장될 수 있지만, 동작(특히 비싼 연산)이 필요한 경우 fun이 더 적절할 수 있습니다.

마지막으로, 확장 함수에 대한 best practice는 팀의 코드 스타일 가이드에 따라 다를 수 있습니다. 중요한 것은 팀원들이 쉽게 이해하고 유지보수할 수 있도록 일관된 스타일을 유지하는 것입니다.

관련하여 강의에서 나온 확장 함수 스타일의 차이점 이해하기라는 게시글에서 더 많은 토론을 확인하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.