티스토리 뷰
04 : 메서드 레퍼런스
메서드 레퍼런스 사용방식
다른 코드에 전달하려는 액션을 수행하는 메서드가 이미 존재할 수 도 있다.
예를 들면, 버튼을 클릭할때 마다 단순히 이벤트 객체를 출력하고 싶은 경우이다.
1 | button.setOnAction(event -> System.out.println(event)); |
하지만 setOnAction 메서드에 println 메서드만 전달할 수 있다면 더 간편할 것이다.
1 | button.setOnAction(System.out::println); |
System.out::println 표현식은 x -> System.out.println(x)에 해당하는 메서드 레퍼런스 이다.
:: 연산자를 이용해 객체 또는 클래스와 메서드 이름을 구분하며 사용한다.
1. object::instanceMethod
2. Class::staticMethod
3. Class::instanceMethod
Note : 이름이 같은 여러 메서드가 오버로드 되어 있을 때는 컴파일러가 의도한 문맥을 찾으려고 할 것이다. 예를 들면 , Math.max 메서드는 정수와 부동소수점 수를 맏는 버전이 있다. 이 중 어느 버전이 선택 되는지는 Math::max가 변환되어 대상 함수형 인터페이스의 메서드 파라미터에 의존한다.
this 와 super 레퍼런스
메서드 레퍼런스에서 this와 super 파라미터를 캡처할 수도 있다. 다음은 이 기법을 보여준다
1 2 3 4 5 6 7 8 9 10 11 12 | class Greeter { public void greeter(){ System.out.println("Hello, world!"); } } class ConcurrentGreeter extends Greeter{ public void greet(){ Thread t = new Thread(super::greet); t.start(); } } |
위의 스레드가 시작 할땐 해당 스레드의 Runnable이 호출되고 super::greet 가 실행 된다. 이때 슈퍼클래스의 greet 메서드가 호출 된다
Note : 이너 클래서에서는 바깥쪽 클래스의 this 레퍼런스를 EnclosingClass.this::method 또는 EnclosingClass.super::method로 캡쳐 가능하다.
<소스코드>
'Language > Java' 카테고리의 다른 글
[JAVA8] 람다 표현식 (0) | 2017.01.24 |
---|---|
[JAVA8] 람다 표현식 (0) | 2017.01.24 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |