일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- lambda
- AutoConfiguration
- 링커
- 클린코드
- 토비의스프링3.1
- springboot
- 메이븐
- JPA
- 빌드툴
- ORM
- gradle
- FunctionalInterfaces
- 컴퓨터시스템
- 프록시
- 토비의스프링
- DesignPattern
- java
- Spring
- DispatcherServlet
- IOC
- springwebmvc
- String
- hibernate
- ApplicationContext
- Immutable
- 자바
- Kotlin for Java Developers
- 링킹
- exception
- beanfactory
- Today
- Total
엔지니어로 가는 길
JAVA 메소드 참조(Method References) 본문
https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
Method references
람다 표현식에서 하는 일이라고는 이미 존재하는 메소드를 호출하는 게 전부인 경우 Method references를 사용할 수 있다. 이는 말 그대로 (일반적인 람다 표현식의 문법을 따르는 것이 아니라) 그 메소드의 이름을 언급하는 것인데 람다 표현식을 사용한 것보다 간결하고 명확하다.
Person이라는 클래스를 예로 들어보자. age라는 변수를 가지고 있고, compareTo는 두 개의 Person 객체를 인자로 받아 age를 비교하는 static 메소드이다.
세 개의 Person 객체를 만든 뒤 배열에 넣고 Arrays의 sort 메소드를 이용하여 정렬해보자. sort의 첫 번째 인자는 배열이고, 두 번째 인자는 Comparator 인터페이스이다.
Comparator 인터페이스는 functional interface로, compare이라는 메소드를 갖는다. compare는 같은 타입의 객체 두 개를 받아 비교 결과를 int로 리턴하는 메소드이다. Person 클래스에서 이미 compareTo라는 메소드를 구현했으므로 compare에서는 그냥 Person 클래스의 compareTo 메소드를 호출하여 Person 객체 간의 크기를 비교하면 된다.
다시 말해, 1) functional interface이므로 메소드가 하나이기 때문에 익명 클래스가 아닌 람다 표현식을 이용할 수 있고, 2) 메소드에서 하는 일이라고는 이미 존재하는 메소드를 호출하는 것이기 때문에 람다 표현식이 아닌 Method references를 이용할 수 있다. Arrays의 sort의 두 번째 인자로 Method references를 이용하면 아래와 같다.
사실 출력을 위해 사용한 Stream의 forEach는 처음부터 Method references를 사용하고 있었다. forEach는 인자로 Consumer 인터페이스가 필요한데, Consumer 인터페이스도 functional interface이기 때문에 람다표현식으로 가능하고, Consumer의 메소드인 accept에서 하는 일이라고는 System.out의 println 메소드를 호출하는 것이기 때문에 Method references를 사용할 수 있었던 것이다.
주의) 메소드 참조는 메소드의 이름만 적을 뿐 인자에 대한 정보가 아무것도 드러나지 않는다. 따라서 메소드 참조를 사용하려면 람다 표현식의 인자의 개수와 참조하려는 메소드의 인자의 개수가 다르거나 타입이 달라선 안될 것 같다. 아, 'Reference to an instance method of an arbitrary object of a particular type'는 예외이려나?
Method references 종류와 예시
종류 | 예시 |
정적 메소드 참조 | ContainingClass :: staticMethodName |
특정 객체의 인스턴스 메소드 참조 | containingObject :: instanceMethodName |
Reference to an instance method of an arbitrary object of a particular type |
ContainingType :: methodName |
생성자 참조 | ClassName :: new |
'Reference to an instance method of an arbitrary object of a particular type'란 무엇일까. 인스턴스 메소드이기는한데, 타입은 알지만 어떤 인스턴스라고 특정할 수 없는 경우 사용하는 것 같다.
위의 경우는 '특정 객체의 인스턴스 메소드 참조'이다.
위의 경우는 'Reference to an instance method of an arbitrary object of a particular type'이다. 둘이 어떤 차이가 있고 어떨 때 무엇을 쓰는지 알 것 같긴한데 예제가 하나라 확실하지가 않다. 예제를 더 찾아봐야 할 것 같다.
'Reference to an instance method of an arbitrary object of a particular type'는 메소드 참조의 모양이 정적 메소드 참조와 똑같은데 메소드 참조만 보고 둘을 구별할 수는 없는건지도 궁금하다.
'프로그래밍 > Java' 카테고리의 다른 글
JAVA 어노테이션에 대해 알아보자 (0) | 2020.09.05 |
---|---|
JAVA 디폴트 메소드 (0) | 2020.08.30 |
JAVA Interface Consumer<T>와 람다 표현식 (0) | 2020.06.27 |
JAVA 람다 표현식의 문법과 사용 (0) | 2020.06.23 |
JAVA 익명 클래스(Anonymous Classes) (0) | 2020.05.28 |