java-squid/effective-java

[아이템 52] 다중정의는 신중히 사용하라

Closed this issue · 6 comments

[아이템 52] 다중정의는 신중히 사용하라

inexact method reference, implicitly typed lambda expression 설명이 나온 부분 중에,
이제 메서드를 다중 정의할 때, 서로 다른 함수형 인터페이스라도 같은 위치의 인수로 받아서는 안된다..라고 언급하고 있습니다.

  • 그 이유로 이제 서로 다른 함수형 인터페이스라도, 근본적으로는 다르지 않다고 이야기하고 있는데,
  • 이게 어떤 의미인지 잘 감이 안오네요.
  • 같이 한번 이야기 나눠봤으면 좋겠습니다

상위 클래스를 조심해서 오버로딩해라.. 상당히 실수하기 좋은 부분을 짚어주는것 같네요.

inexact method reference, implicitly typed lambda expression 설명이 나온 부분 중에,
이제 메서드를 다중 정의할 때, 서로 다른 함수형 인터페이스라도 같은 위치의 인수로 받아서는 안된다..라고 언급하고 있습니다.

  • 그 이유로 이제 서로 다른 함수형 인터페이스라도, 근본적으로는 다르지 않다고 이야기하고 있는데,
  • 이게 어떤 의미인지 잘 감이 안오네요.
  • 같이 한번 이야기 나눠봤으면 좋겠습니다

읽어봤는데 어려운 내용이라 다같이 보면서 생각해봐야겠네요. 일단 본문 예제 에서의 키워드는 println 인것 같은데
다중정의 해소 알고리즘에 대해서도 알아봐야 할듯하네요.

@102092 @tmdgusya

  • 다중정의 해소 알고리즘에서 왜 서로 다른 함수형 인터페이스가 인식이 되지 못 하고, 정확히 inexact method reference가 뭔지까지 컴파일러 이론을 깊게 파고들 필요는 없는 거 같고 간단한 예시들에 대한 설명과 키포인트만 짚고 넘어갈게요.
  • 오버로딩이 된 메서드가 같은 위치에 함수형 인터페이스를 인수를 받는 예시가 바로 ExecutorService의 1. submit(Runnable)2. submit(Callable)입니다. Runnable하고 Callable은 둘 다 functional interface이고 한 개의 abstract method만을 가지고 있는 것을 확인할 수 있습니다. 둘의 차이로 Runnable은 0개의 인풋에 0개에 아웃풋을 반환하는 반면에 Callable은 0개의 인풋에 1개의 아웃풋을 반환하는 것을 확인할 수 있습니다.
  • 책에서는 println 메서드가 오버로딩이 된 메서드가 아니었다면 컴파일 에러가 나지 않을 것이라고 했는데 예시 코드를 좀 짜봤습니다.
  • 예시에서 보이는 것처럼 함수형 인터페이스 인수를 넘겨줄 때 정적 타입을 확실히 해서 넘겨주면 컴파일 에러를 피할 수는 있지만 클라이언트 쪽에서 코드를 짜기에 굉장히 불편해집니다. 처음부터 같은 위치에 함수형 인퍼페이스를 인수로 받지 않았다면 이 모든 문제들을 피할 수 있다~가 요점이라고 보면 될 거 같습니다.
  • submit 의 경우 Runnable 혹은 Callable 이라는 함수형 인터페이스를 받네요.
  • println의 메서드의 경우 Runnable, Callable 인터페이스형태로 둘다 반환할 수 있기 때문에 애매하다고 여겨져 컴파일 단계에서 에러가 발생하는 거라고 이해하면 될까요?
  • 친절한 설명 감사합니다. ㅎㅎ

@102092

  • println의 메서드의 경우 Runnable, Callable 인터페이스형태로 둘다 반환할 수 있기 때문에 애매하다고 여겨져 컴파일 단계에서 에러가 발생하는 거라고 이해하면 될까요?

조금 더 정확히 들여다보면 println 메서드 중에 Callable 인터페이스의 형태인 경우는 없네요. 아웃풋을 반환하는 경우가 없으니까요. 오버로딩이 되어서 "inexact" 해지는 것 자체에서 컴파일 에러가 발생하는 것으로 보여집니다!