본문 바로가기

알게 된 것

[알게 된 것] - 자바와 함수 포인터

 현재 졸작으로 개발하고 있는 어플리케이션 코드를 정리하던 도중 android studio에서 희안한 메시지를 발견했다.

 

 

Annoymous new Object() can be replaced with lambda

 

 

 일단 setClickListener라는 함수는 두번째 인자로 함수를 받게끔 인터페이스를 설계하였다. 다만 android 어플 개발에 사용한 언어가 자바라서 함수를 인자로 넘기는건 안된다. C/C++이라면 함수포인터, C#이라면 delegate 문법을 사용해서 넘기면 되는데 자바는 문법상 함수를 넘기는게 안돼서 함수를 포함하는 객체를 넘기는 수 밖에 없다.

 

 때문에 위의 'Annoymous new Object() can be replaced with lambda'  라는 메시지는 상당히 아리송했다. 궁금한 마음에  'Replace with lambda' 를 눌러 봤는데 아래와 같이 바뀌었다.

 

 

 

 

 

 분명 알기로는 메서드 자체를 넘기는 것이 불가능 했는데 위와 같이 람다식 형태로 바뀌어 인자로 넘기는 것을 알 수 있다. 제대로 동작하는 지 확인을 해보아도 정상적으로 작동하였다. 뭔가 내가 모르는 문법이 있는 건가 해서 찾아 보았는데 의외로 답은 명쾌했다.

 

 

https://stackoverflow.com/questions/37695456/how-do-i-replace-an-anonymous-class-with-a-lambda-in-java?rq=1 

 

How do I replace an anonymous class with a lambda in Java?

I've got this code but IntelliJ tells me to replace anonymous with lambda but I don't know how. can anyone help me with this? Here is my code: soundVolume.valueProperty().addListener(new ChangeLis...

stackoverflow.com

 

Note
 the replacement of an anonymous class with lambda is possible only if the anonymous class has one method. If the anonymous class has more methods then the substitution is not possible.

 

 

 답변 내용 중에 '메서드 하나만을 가지는 익명 클래스는 람다로 변환이 가능하다' 라고 답변에 나와있다. 자바로 개발을 해보면서 함수 포인터의 부재를 깊이 느끼고 있었는데, 이러한 형식으로 간접적으로 함수 포인터를 제공하고 있기는 하구나라는 생각이 들었다.

 

 

 사실 자바도 C#처럼 delegate 문법을 지원할 수 있게 되면 참 편할 것 같은데 이런 점에서는 또 C#이 편리한 언어인 것은 맞는 것 같다.