slipp / jwp-book

자바 웹 프로그래밍 학습을 위한 저장소
383 stars 130 forks source link

273쪽의 @FuncationalInterface 관련 설명 #3

Closed benelog closed 7 years ago

benelog commented 7 years ago

람다를 사용하려면 RowMapper와 같이 인터페이스의 메서드가 하나만 존재해야한다. 람다 표현식으로 사용할 인터페이스라고 지정하려면 이터페이스에 @FuntionalInterface 애노테이션을 추가해야한다.

간략한 설명을 위해서 위와 같이 적으신것 같습니다.

그런데 아시다시피 @FuntionalInterface은 필수는 아닙니다. 람다로 쓸 인터페이스에 이를 다는 것은 강력히 권고할만합니다. 그런데 혹시나 @FuntionalInterface 가 달린 인터페이스만을 람다로 쓸수 있다고 독자가 오해할 수도 있지 않을까하는 걱정이 들기도 합니다. 필수요건인 '인터페이스의 메서드가 하나'가 바로 앞문장에 나오기에 더욱 그렇게 생각할 여지가 있지 않을까합니다.

풀어쓴다면 @FuntionalInterface를 달면 의도를 명확히 표현할수 있고 , 필요한 조건(추상 메서드가 하나)에 맞지 않을 경우 컴파일 에러를 내어주기 때문에 람다로 쓰기를 유도하고 싶은 인터페이스에는 @FuntionalInterface를 달것을 강력히 추천한다.. 정도가 좋지않을까 합니다. 또는 @FuntionalInterface의 javadoc을 읽어보고 이게 필수는 아니지만, 달지 않았을때보다 어떤 이득이 있을지 알아내라는 것을 과제로 내는 것도 괜찮아보입니다.

https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html

However, the compiler will treat any interface meeting the definition of a functional interface as a functional interface regardless of whether or not a FunctionalInterface annotation is present on the interface declaration.

그리고 '..RowMapper와 같이 인터페이스의 메서드가 하나만 존재해야한다.' 부분도 디폴트 메서드는 들어가있어서 상관없으므로 '추상 메서드가 하나만..'이 더 정확한 표현이기는 합니다. 이런것도 javadoc에 나와 있으니 독자가 파해쳐보도록 유도할수도 있겠네요.

javajigi commented 7 years ago

람다에 대해 깊이 있게 다루지 않고 간략히 설명하고 넘어가려고 하다보니 약간의 오해할 부분이 많겠다. 네가 준 의견 참고해서 수정할게. 피드백 고맙다.