강의

멘토링

로드맵

Inflearn brand logo image

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

나구리님의 프로필 이미지
나구리

작성한 질문수

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

17강. 코틀린에서 람다를 다루는 방법

자바와 코틀린의 함수형 프로그래밍,

작성

·

21

1

안녕하세요 강사님!

 

자바는 메소드 자체를 직접 넘겨주는 것 처럼 쓸 수 있다, 자바에서 함수는 변수에 할당되거나 파라미터로 전달할 수 없다.

 

이부분에서 명확하게 이해가 잘 안되어서 질문을 남깁니다 ㅠ

 

자바에서 JDK 8이후로 람다와 스트림, 함수형 인터페이스 덕분에 자바도 함수가 일급 시민으로 취급되어 함수형 프로그래밍 패러다임을 적용해서 상호 보완해나가며 개발할 수 있다고 배웠습니다.

 

그러나 강사님께서 말씀하시는 내용으로는 자바는 그런 것 함수가 일급 시민 자체가 된 것이 아니라, '일급 시민이 된 것 처럼' 동작하도록 함수형 인터페이스를 통해 함수형 프로그래밍을 할 수 있게 된 것이지 근본 자체가 일급 시민이 아니라는 말씀이신건지가 궁금합니다..

 

중요한 내용은 아닌것 같지만 모호하게 알고 넘어가기가 찜찜해서 질문을 남겨드립니다.

답변 1

1

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

안녕하세요~ 나구리님! 🙂 좋은 질문 감사합니다.

자바는 '일급 시민이 된 것 처럼' 동작하도록 함수형 인터페이스를 통해 함수형 프로그래밍을 할 수 있게 된 것이지 근본 자체가 일급 시민이 아니라는 말씀이신건지가 궁금합니다..

이라고 표현해 주셨는데요! 표현해주신 내용이 정확합니다.

자바는 함수형 프로그래밍을 사용하기 위해 interface를 활용했고, interface의 구현체는 class로 함수와는 엄연히 다르게 취급된다고 할 수 있습니다. 즉, 함수형 프로그래밍이 가능은 하지만, 함수가 1급 시민은 아닌 셈이죠~

중요한 내용은 아니라고 생각하실 수도 있지만, 이런 차이를 정확히 이해하면 코틀린에만 존재하는 inline function, noinline 등이 왜 등장하게 되었는지도 쉽게 이해하실 수 있을 것 같아요!

 

간략히만 말씀드려 보면 다음과 같습니다. 🙂

  • JVM은 함수를 일급 객체로 보지 않는데, Kotlin은 함수를 일급 객체로 보면서도 JVM level에서 돌아갈 때는 함수형 인터페이스로 .class 파일이 만들어 져야 한다.

  • 이를 위해 Kotlin이 컴파일 될 때 함수는 FunctionN 이라는 특수한 타입으로 컴파일 되는데

    이는 결국 class의 method 호출을 의미한다. (= 약간의 오버로드)

  • 따라서 오버로드를 완전히 줄이기 위해 진짜 함수 그 자체를 사용 지점에서 사용하고 싶다면 inline 키워드를 붙여 .class 파일이 만들어 질 때 함수 구현체 자체를 붙여 넣게 되고

  • 상황에 따라 inlining 하고 싶지 않은 경우는 noinline 키워드를 사용하게 된다.

 

답변이 도움이 되었으면 좋겠습니다. 또 궁금하신 내용 있으시면 언제든 편하게 찾아주세요~ 감사합니다.

나구리님의 프로필 이미지
나구리
질문자

아.. inline 키워드의 최적화가 코틀린에서 부득이하게 컴파일 시 오버로드가 필요한데,, 이걸 함수를 작성한 지점에서 그대로 사용하기 위해서 코드를 복붙한다는 그런 느낌이군요..!!

오.. 신기합니다 ㅎㅎ
친절한 답변 감사합니다 강사님!!

나구리님의 프로필 이미지
나구리

작성한 질문수

질문하기