#메서드 참조
- 람다식에서 불필요한 매개변수를 제거할 때 사용한다.
- 인터페이스의 추상 메서드의 매개변수와 리턴 타입에 따라 달라진다.
- 메서드 참조는 정적 / 인스턴스 메서드와 생성자도 참조 가능하다.
- 메서드 참조의 기본 형태는 다음과 같다.
// 클래스이름 :: 메서드이름
// Math 클래스의 max() 정적 메서드를 참조
Math :: max // 메서드 참조
#정적 메서드와 인스턴스 메서드 참조
// 정적 메서드의 참조
클래스 이름 :: 메서드
// 인스턴스 메서드의 참조
(객체생성필요)참조 변수 :: 메서드
//Calculator.java
public class Calculator {
public static int staticMethod(int x, int y) { // 정적 메서드
return x + y;
}
public int instacneMethod(int x, int y) { // 인스턴스 메서드
return x / y;
}
}
import java.util.function.IntBinaryOperator;
public class MethodReferences {
public static void main(String[] args) throws Exception {
IntBinaryOperator operator;
/* 정적 메서드
클래스이름 :: 메서드이름
*/
operator = Calculator::staticMethod;
System.out.println("정적메서드 결과 : " + operator.applyAsInt(5, 2));
/* 인스턴스 메서드
인스턴스명::메서드명
*/
Calculator calculator = new Calculator(); // 인스턴스 생성
operator = calculator::instanceMethod;
System.out.println("인스턴스 메서드 결과 : " + operator.applyAsInt(10, 2));
}
}
// 출력값
정적메서드 결과 : 8
인스턴스 메서드 결과 : 5
#생성자 참조
- 생성자 참조는 객체 생성을 의미한다.
- 메서드 호출로 구성된 람다식을 메서드 참조로 대치하는 것과 같이,
객체를 생성하고 리턴하도록 구성된 람다식은 생성자 참자로 대치할 수 있다.
- 생성자가 오버로딩 되어 여러개가 존재할 때, 컴파일러는 함수형 인터페이스의 추상 메서드와 동일한 매개 변수 타입과 개수가 있는 생성자를 찾아 실행한다. 만약 존재하지 않으면 에러가 발생한다.
// 생성자 참조 문법
클래스 :: new
// Member.java
public class Member {
private String name;
private String id;
public Member() {
System.out.println("Member() 실행");
}
public Memer(String id) {
System.out.println("Member(String id) 실행");
this.id = id;
}
public Member(String name, String id) {
System.out.println("Member(String name, String id) 실행");
this.id = id;
this.name = name;
}
public String getName() {
return name;
}
public String getId() {
return id;
}
}
- 아래 코드는 생성자 참조를 이용해 두 가지 방법으로 Member 객체를 생성하고 있다.
import java.util.function.BiFunction;
import java.util.function.Function;
public class ConstructorRef {
public static void main(String[] args) throws Exception {
Function<String, Member> function1 = Member::new; // 함수형 인터페이스의 메서드를 이용한 Member 객체 생성
Member member1 = function1.apply("kimcoding");
BiFunction<String, String, Member> function2 = Member::new; // 함수형 인터페이스의 Member 객체 생성
Member member2 = function2.apply("kimcoding", "김코딩");
}
}
/*
Member(String id) 실행
Member(String name, String id) 실행
*/
'개발지 > Today I learn' 카테고리의 다른 글
[0830] 자바 스트림 (스트림 파이프라인 - 1. 스트림의 생성) (0) | 2023.08.30 |
---|---|
[0829] 자바 스트림 (0) | 2023.08.29 |
[0824-25] 자바 람다식(람다식, 함수형 인터페이스) (0) | 2023.08.25 |
[0823] 자바 애너테이션 (메타 애너테이션, 사용자 정의 애너테이션) (0) | 2023.08.23 |
[0823] 자바 애너테이션 (표준 애너테이션) (0) | 2023.08.23 |